fdb2 1.0.37 → 1.0.38

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 (106) hide show
  1. package/README.md +41 -0
  2. package/dist/public/explorer.css +517 -478
  3. package/dist/public/explorer.js +1114 -872
  4. package/dist/public/index.css +87 -27
  5. package/dist/public/index.js +97 -49
  6. package/dist/public/layout.js +2 -2
  7. package/dist/public/vue.js +1 -1
  8. package/dist/server/core/schema/__tests__/canonical.test.ts +195 -0
  9. package/dist/server/core/schema/__tests__/ddl-emitter.test.ts +456 -0
  10. package/dist/server/core/schema/__tests__/diff.test.ts +242 -0
  11. package/dist/server/core/schema/__tests__/roundtrip.property.test.ts +403 -0
  12. package/dist/server/core/schema/canonical.d.ts +50 -0
  13. package/dist/server/core/schema/canonical.d.ts.map +1 -0
  14. package/dist/server/core/schema/canonical.js +212 -0
  15. package/dist/server/core/schema/canonical.js.map +1 -0
  16. package/dist/server/core/schema/canonical.ts +223 -0
  17. package/dist/server/core/schema/ddl-emitter.d.ts +68 -0
  18. package/dist/server/core/schema/ddl-emitter.d.ts.map +1 -0
  19. package/dist/server/core/schema/ddl-emitter.js +813 -0
  20. package/dist/server/core/schema/ddl-emitter.js.map +1 -0
  21. package/dist/server/core/schema/ddl-emitter.ts +925 -0
  22. package/dist/server/core/schema/diff.d.ts +16 -0
  23. package/dist/server/core/schema/diff.d.ts.map +1 -0
  24. package/dist/server/core/schema/diff.js +115 -0
  25. package/dist/server/core/schema/diff.js.map +1 -0
  26. package/dist/server/core/schema/diff.ts +134 -0
  27. package/dist/server/core/schema/type-defaults.d.ts +27 -0
  28. package/dist/server/core/schema/type-defaults.d.ts.map +1 -0
  29. package/dist/server/core/schema/type-defaults.js +61 -0
  30. package/dist/server/core/schema/type-defaults.js.map +1 -0
  31. package/dist/server/core/schema/type-defaults.ts +79 -0
  32. package/dist/server/index.d.ts +1 -1
  33. package/dist/server/index.d.ts.map +1 -1
  34. package/dist/server/index.js +347 -124
  35. package/dist/server/index.js.map +1 -1
  36. package/dist/server/index.ts +336 -161
  37. package/dist/server/model/ddl-spec.d.ts +163 -0
  38. package/dist/server/model/ddl-spec.d.ts.map +1 -0
  39. package/dist/server/model/ddl-spec.js +32 -0
  40. package/dist/server/model/ddl-spec.js.map +1 -0
  41. package/dist/server/model/ddl-spec.ts +175 -0
  42. package/dist/server/service/connection.service.d.ts +20 -0
  43. package/dist/server/service/connection.service.d.ts.map +1 -1
  44. package/dist/server/service/connection.service.js +99 -25
  45. package/dist/server/service/connection.service.js.map +1 -1
  46. package/dist/server/service/connection.service.ts +104 -25
  47. package/dist/server/service/database/base.service.d.ts +0 -4
  48. package/dist/server/service/database/base.service.d.ts.map +1 -1
  49. package/dist/server/service/database/base.service.js.map +1 -1
  50. package/dist/server/service/database/base.service.ts +0 -5
  51. package/dist/server/service/database/clickhouse.service.d.ts +0 -5
  52. package/dist/server/service/database/clickhouse.service.d.ts.map +1 -1
  53. package/dist/server/service/database/clickhouse.service.js +0 -49
  54. package/dist/server/service/database/clickhouse.service.js.map +1 -1
  55. package/dist/server/service/database/clickhouse.service.ts +0 -52
  56. package/dist/server/service/database/cockroachdb.service.d.ts +0 -5
  57. package/dist/server/service/database/cockroachdb.service.d.ts.map +1 -1
  58. package/dist/server/service/database/cockroachdb.service.js +11 -142
  59. package/dist/server/service/database/cockroachdb.service.js.map +1 -1
  60. package/dist/server/service/database/cockroachdb.service.ts +11 -161
  61. package/dist/server/service/database/database.service.d.ts +55 -2
  62. package/dist/server/service/database/database.service.d.ts.map +1 -1
  63. package/dist/server/service/database/database.service.js +246 -4
  64. package/dist/server/service/database/database.service.js.map +1 -1
  65. package/dist/server/service/database/database.service.ts +295 -7
  66. package/dist/server/service/database/mongodb.service.d.ts +0 -6
  67. package/dist/server/service/database/mongodb.service.d.ts.map +1 -1
  68. package/dist/server/service/database/mongodb.service.js +0 -8
  69. package/dist/server/service/database/mongodb.service.js.map +1 -1
  70. package/dist/server/service/database/mongodb.service.ts +0 -8
  71. package/dist/server/service/database/mssql.service.d.ts +8 -4
  72. package/dist/server/service/database/mssql.service.d.ts.map +1 -1
  73. package/dist/server/service/database/mssql.service.js +27 -101
  74. package/dist/server/service/database/mssql.service.js.map +1 -1
  75. package/dist/server/service/database/mssql.service.ts +28 -122
  76. package/dist/server/service/database/mysql.service.d.ts +0 -4
  77. package/dist/server/service/database/mysql.service.d.ts.map +1 -1
  78. package/dist/server/service/database/mysql.service.js +11 -137
  79. package/dist/server/service/database/mysql.service.js.map +1 -1
  80. package/dist/server/service/database/mysql.service.ts +11 -173
  81. package/dist/server/service/database/oracle.service.d.ts +0 -4
  82. package/dist/server/service/database/oracle.service.d.ts.map +1 -1
  83. package/dist/server/service/database/oracle.service.js +11 -104
  84. package/dist/server/service/database/oracle.service.js.map +1 -1
  85. package/dist/server/service/database/oracle.service.ts +11 -127
  86. package/dist/server/service/database/postgres.service.d.ts +0 -4
  87. package/dist/server/service/database/postgres.service.d.ts.map +1 -1
  88. package/dist/server/service/database/postgres.service.js +11 -112
  89. package/dist/server/service/database/postgres.service.js.map +1 -1
  90. package/dist/server/service/database/postgres.service.ts +11 -133
  91. package/dist/server/service/database/sap.service.d.ts +0 -4
  92. package/dist/server/service/database/sap.service.d.ts.map +1 -1
  93. package/dist/server/service/database/sap.service.js +11 -137
  94. package/dist/server/service/database/sap.service.js.map +1 -1
  95. package/dist/server/service/database/sap.service.ts +11 -158
  96. package/dist/server/service/database/sql-type.helper.d.ts.map +1 -1
  97. package/dist/server/service/database/sql-type.helper.js +9 -47
  98. package/dist/server/service/database/sql-type.helper.js.map +1 -1
  99. package/dist/server/service/database/sql-type.helper.ts +11 -53
  100. package/dist/server/service/database/sqlite.service.d.ts +0 -5
  101. package/dist/server/service/database/sqlite.service.d.ts.map +1 -1
  102. package/dist/server/service/database/sqlite.service.js +11 -147
  103. package/dist/server/service/database/sqlite.service.js.map +1 -1
  104. package/dist/server/service/database/sqlite.service.ts +11 -177
  105. package/package.json +1 -1
  106. package/server.js +1 -1
@@ -1,7 +1,19 @@
1
1
  import { i as __require, n as __esmMin, t as __commonJSMin } from "./rolldown-runtime.js";
2
- import { A as defineComponent, B as renderList, C as createBlock, D as createStaticVNode, E as createSlots, F as nextTick, G as withCtx, I as onBeforeUnmount, K as withDirectives, L as onMounted, O as createTextVNode, S as createBaseVNode, T as createElementBlock, W as watch, _ as vModelText, a as init_vue_router, b as Fragment, ct as toDisplayString, d as init_vue_runtime_esm_bundler, g as vModelSelect, h as vModelCheckbox, k as createVNode, l as init_vue_i18n, o as useRoute, ot as normalizeClass, s as useRouter, st as normalizeStyle, tt as ref, u as useI18n, v as vShow, w as createCommentVNode, x as computed, y as withModifiers, z as openBlock } from "./vue.js";
3
- import { A as defineStore, C as init_rpc, D as vscodeSaveFile, E as vscodePickSaveFolder, O as init_detect, S as blobToBase64, T as vscodeNotifyExported, _ as init__plugin_vue_export_helper, a as dataGrid_default, b as init_base, c as pagination_default, d as init_loading, f as init_toast, g as _plugin_vue_export_helper_default, h as toast_default, i as showConfirm, j as init_pinia, k as isVSCode, l as init_modal$1, m as init_toast$1, n as init_modal$2, o as init_dataGrid, p as toast, r as showAlert, s as init_pagination, t as getModalInstance, u as modal_default, v as getT, w as isVscodeWebview, x as request, y as init_i18n } from "./index.js";
2
+ import { A as defineComponent, B as renderList, C as createBlock, D as createStaticVNode, E as createSlots, F as nextTick, G as watch, I as onBeforeUnmount, K as withCtx, L as onMounted, O as createTextVNode, S as createBaseVNode, T as createElementBlock, _ as vModelText, a as init_vue_router, b as Fragment, ct as normalizeStyle, d as init_vue_runtime_esm_bundler, g as vModelSelect, h as vModelCheckbox, k as createVNode, l as init_vue_i18n, lt as toDisplayString, nt as ref, o as useRoute, q as withDirectives, s as useRouter, st as normalizeClass, u as useI18n, v as vShow, w as createCommentVNode, x as computed, y as withModifiers, z as openBlock } from "./vue.js";
3
+ import { A as isVSCodeEnvironment, C as init_rpc, D as vscodeSaveFile, E as vscodePickSaveFolder, M as isVSCode, N as defineStore, O as getVSCodeBridge, P as init_pinia, S as blobToBase64, T as vscodeNotifyExported, _ as init__plugin_vue_export_helper, a as dataGrid_default, b as init_base, c as pagination_default, d as init_loading, f as init_toast, g as _plugin_vue_export_helper_default, h as toast_default, i as showConfirm, j as init_detect, k as init_bridge, l as init_modal$1, m as init_toast$1, n as init_modal$2, o as init_dataGrid, p as toast, r as showAlert, s as init_pagination, t as getModalInstance, u as modal_default, v as getT, w as isVscodeWebview, x as request, y as init_i18n } from "./index.js";
4
4
  //#region src/service/database.ts
5
+ /**
6
+ * 数据库管理服务
7
+ */
8
+ /**
9
+ * 解包统一响应:{ ret, msg, data }。
10
+ * 后端现在只返回业务数据、失败一律 throw(由响应层包装成 ret 非 0 + msg 错误信息),
11
+ * 因此这里 ret !== 0 时直接抛出 msg,调用方拿到的就是纯净的业务数据。
12
+ */
13
+ function unwrapData(res) {
14
+ if (res && typeof res === "object" && "ret" in res && res.ret !== 0) throw new Error(res.msg || "操作失败");
15
+ return res?.data ?? res;
16
+ }
5
17
  var ConnectionService, DatabaseService;
6
18
  var init_database = __esmMin((() => {
7
19
  init_base();
@@ -193,25 +205,55 @@ var init_database = __esmMin((() => {
193
205
  });
194
206
  }
195
207
  /**
196
- * 保存表结构(新建表)
208
+ * 手动刷新表列表缓存(全量拉取,用于重名检测等需要最新结构的场景)
209
+ */
210
+ async refreshTableCache(connectionId, database) {
211
+ return unwrapData(await request("/api/database/refreshTableCache", {
212
+ id: connectionId,
213
+ database
214
+ }));
215
+ }
216
+ /**
217
+ * 预览建表(目标态 TableSpec -> 建表 DDL 与方言能力,不执行)
197
218
  */
198
- async saveTableStructure(connectionId, database, table, columns) {
199
- return request("/api/database/saveTableStructure", {
219
+ async previewCreateTable(connectionId, database, spec) {
220
+ return unwrapData(await request("/api/database/previewCreateTable", {
200
221
  id: connectionId,
201
222
  database,
202
- table,
203
- columns
204
- });
223
+ spec
224
+ }));
205
225
  }
206
226
  /**
207
- * 修改表结构
227
+ * 执行建表(后端检测重名后生成并执行)
208
228
  */
209
- async alterTable(connectionId, database, tableDiff) {
210
- return request("/api/database/alterTable", {
229
+ async executeCreateTable(connectionId, database, spec) {
230
+ return unwrapData(await request("/api/database/executeCreateTable", {
211
231
  id: connectionId,
212
232
  database,
213
- tableDiff
214
- });
233
+ spec
234
+ }));
235
+ }
236
+ /**
237
+ * 预览表结构变更(目标态 TableSpec -> DDL 语句与变更集,不执行)
238
+ */
239
+ async previewAlterTable(connectionId, database, tableName, spec) {
240
+ return unwrapData(await request("/api/database/previewAlterTable", {
241
+ id: connectionId,
242
+ database,
243
+ tableName,
244
+ spec
245
+ }));
246
+ }
247
+ /**
248
+ * 执行表结构变更(后端重读实时结构生成语句并执行)
249
+ */
250
+ async executeAlterTable(connectionId, database, tableName, spec) {
251
+ return unwrapData(await request("/api/database/executeAlterTable", {
252
+ id: connectionId,
253
+ database,
254
+ tableName,
255
+ spec
256
+ }));
215
257
  }
216
258
  /**
217
259
  * 插入数据
@@ -270,6 +312,27 @@ var init_database = __esmMin((() => {
270
312
  });
271
313
  }
272
314
  /**
315
+ * 导出数据库架构(DDL)
316
+ * 后端返回:{ success: boolean, schema: string }
317
+ */
318
+ async exportSchema(connectionId, databaseName) {
319
+ return request("/api/database/exportSchema", {
320
+ id: connectionId,
321
+ databaseName
322
+ });
323
+ }
324
+ /**
325
+ * 查看数据库日志
326
+ * 后端返回:{ success: boolean, logs: any[] }
327
+ */
328
+ async viewLogs(connectionId, databaseName, limit = 100) {
329
+ return request("/api/database/viewLogs", {
330
+ id: connectionId,
331
+ databaseName,
332
+ limit
333
+ });
334
+ }
335
+ /**
273
336
  * 恢复数据库
274
337
  */
275
338
  async restoreDatabase(connectionId, database, filePath, options) {
@@ -414,7 +477,7 @@ var init_database = __esmMin((() => {
414
477
  }));
415
478
  //#endregion
416
479
  //#region src/components/connection-editor/index.vue?vue&type=script&setup=true&lang.ts
417
- var _hoisted_1$9, _hoisted_2$9, _hoisted_3$9, _hoisted_4$9, _hoisted_5$9, _hoisted_6$9, _hoisted_7$9, _hoisted_8$9, _hoisted_9$9, _hoisted_10$9, _hoisted_11$9, _hoisted_12$9, _hoisted_13$9, _hoisted_14$9, _hoisted_15$9, _hoisted_16$9, _hoisted_17$9, _hoisted_18$9, _hoisted_19$9, _hoisted_20$8, _hoisted_21$8, _hoisted_22$8, _hoisted_23$8, _hoisted_24$8, _hoisted_25$8, _hoisted_26$7, _hoisted_27$7, _hoisted_28$7, _hoisted_29$7, _hoisted_30$6, _hoisted_31$6, _hoisted_32$6, _hoisted_33$6, _hoisted_34$6, _hoisted_35$6, _hoisted_36$6, _hoisted_37$6, _hoisted_38$6, _hoisted_39$6, _hoisted_40$6, _hoisted_41$6, _hoisted_42$6, _hoisted_43$6, _hoisted_44$6, _hoisted_45$6, _hoisted_46$6, _hoisted_47$6, _hoisted_48$5, _hoisted_49$5, _hoisted_50$5, _hoisted_51$5, _hoisted_52$5, _hoisted_53$5, _hoisted_54$4, _hoisted_55$4, _hoisted_56$4, _hoisted_57$4, _hoisted_58$4, _hoisted_59$4, _hoisted_60$4, _hoisted_61$4, index_vue_vue_type_script_setup_true_lang_default;
480
+ var _hoisted_1$9, _hoisted_2$9, _hoisted_3$9, _hoisted_4$9, _hoisted_5$9, _hoisted_6$9, _hoisted_7$9, _hoisted_8$9, _hoisted_9$9, _hoisted_10$9, _hoisted_11$9, _hoisted_12$9, _hoisted_13$9, _hoisted_14$9, _hoisted_15$9, _hoisted_16$9, _hoisted_17$9, _hoisted_18$9, _hoisted_19$9, _hoisted_20$8, _hoisted_21$8, _hoisted_22$8, _hoisted_23$8, _hoisted_24$8, _hoisted_25$8, _hoisted_26$7, _hoisted_27$7, _hoisted_28$7, _hoisted_29$7, _hoisted_30$6, _hoisted_31$6, _hoisted_32$6, _hoisted_33$6, _hoisted_34$6, _hoisted_35$6, _hoisted_36$6, _hoisted_37$6, _hoisted_38$6, _hoisted_39$6, _hoisted_40$6, _hoisted_41$6, _hoisted_42$6, _hoisted_43$6, _hoisted_44$6, _hoisted_45$6, _hoisted_46$6, _hoisted_47$5, _hoisted_48$5, _hoisted_49$5, _hoisted_50$5, _hoisted_51$5, _hoisted_52$5, _hoisted_53$5, _hoisted_54$5, _hoisted_55$5, _hoisted_56$5, _hoisted_57$4, _hoisted_58$4, _hoisted_59$4, _hoisted_60$4, _hoisted_61$4, _hoisted_62$4, _hoisted_63$4, _hoisted_64$4, _hoisted_65$4, _hoisted_66$4, _hoisted_67$4, _hoisted_68$4, _hoisted_69$4, _hoisted_70$4, _hoisted_71$4, _hoisted_72$3, _hoisted_73$3, index_vue_vue_type_script_setup_true_lang_default;
418
481
  var init_index_vue_vue_type_script_setup_true_lang = __esmMin((() => {
419
482
  init_vue_runtime_esm_bundler();
420
483
  init_vue_i18n();
@@ -464,7 +527,10 @@ var init_index_vue_vue_type_script_setup_true_lang = __esmMin((() => {
464
527
  _hoisted_35$6 = { class: "form-group-modern" };
465
528
  _hoisted_36$6 = { class: "form-label-modern" };
466
529
  _hoisted_37$6 = ["placeholder"];
467
- _hoisted_38$6 = { class: "form-section" };
530
+ _hoisted_38$6 = {
531
+ key: 2,
532
+ class: "form-section"
533
+ };
468
534
  _hoisted_39$6 = { class: "section-header" };
469
535
  _hoisted_40$6 = { class: "section-title" };
470
536
  _hoisted_41$6 = { class: "section-content" };
@@ -473,28 +539,40 @@ var init_index_vue_vue_type_script_setup_true_lang = __esmMin((() => {
473
539
  _hoisted_44$6 = { class: "form-label-modern" };
474
540
  _hoisted_45$6 = ["placeholder"];
475
541
  _hoisted_46$6 = { class: "form-group-modern" };
476
- _hoisted_47$6 = { class: "form-label-modern" };
542
+ _hoisted_47$5 = { class: "form-label-modern" };
477
543
  _hoisted_48$5 = ["placeholder"];
478
- _hoisted_49$5 = { class: "form-section" };
479
- _hoisted_50$5 = { class: "section-header" };
480
- _hoisted_51$5 = { class: "section-title" };
481
- _hoisted_52$5 = { class: "section-content" };
482
- _hoisted_53$5 = { class: "form-group-modern" };
483
- _hoisted_54$4 = { class: "form-label-modern" };
484
- _hoisted_55$4 = { class: "form-check-modern" };
485
- _hoisted_56$4 = {
544
+ _hoisted_49$5 = { class: "form-hint" };
545
+ _hoisted_50$5 = { class: "form-section" };
546
+ _hoisted_51$5 = { class: "section-header" };
547
+ _hoisted_52$5 = { class: "section-title" };
548
+ _hoisted_53$5 = { class: "section-content" };
549
+ _hoisted_54$5 = { class: "form-grid" };
550
+ _hoisted_55$5 = { class: "form-group-modern" };
551
+ _hoisted_56$5 = { class: "form-label-modern" };
552
+ _hoisted_57$4 = ["placeholder"];
553
+ _hoisted_58$4 = { class: "form-group-modern" };
554
+ _hoisted_59$4 = { class: "form-label-modern" };
555
+ _hoisted_60$4 = ["placeholder"];
556
+ _hoisted_61$4 = { class: "form-section" };
557
+ _hoisted_62$4 = { class: "section-header" };
558
+ _hoisted_63$4 = { class: "section-title" };
559
+ _hoisted_64$4 = { class: "section-content" };
560
+ _hoisted_65$4 = { class: "form-group-modern" };
561
+ _hoisted_66$4 = { class: "form-label-modern" };
562
+ _hoisted_67$4 = { class: "form-check-modern" };
563
+ _hoisted_68$4 = {
486
564
  class: "form-check-label-modern",
487
565
  for: "enabled"
488
566
  };
489
- _hoisted_57$4 = { class: "check-text" };
490
- _hoisted_58$4 = { class: "check-description" };
491
- _hoisted_59$4 = {
567
+ _hoisted_69$4 = { class: "check-text" };
568
+ _hoisted_70$4 = { class: "check-description" };
569
+ _hoisted_71$4 = {
492
570
  type: "button",
493
571
  class: "btn btn-secondary",
494
572
  "data-bs-dismiss": "modal"
495
573
  };
496
- _hoisted_60$4 = { class: "error-content" };
497
- _hoisted_61$4 = { class: "error-message" };
574
+ _hoisted_72$3 = { class: "error-content" };
575
+ _hoisted_73$3 = { class: "error-message" };
498
576
  index_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
499
577
  __name: "index",
500
578
  props: {
@@ -538,6 +616,16 @@ var init_index_vue_vue_type_script_setup_true_lang = __esmMin((() => {
538
616
  isValid: false,
539
617
  message: t("connection.typeRequired")
540
618
  };
619
+ if (connection.type === "remote") {
620
+ if (!connection.options?.remoteUrl?.trim()) return {
621
+ isValid: false,
622
+ message: t("connection.remoteUrlRequired")
623
+ };
624
+ return {
625
+ isValid: true,
626
+ message: ""
627
+ };
628
+ }
541
629
  if (connection.type !== "sqlite") {
542
630
  if (!connection.host?.trim()) return {
543
631
  isValid: false,
@@ -591,7 +679,10 @@ var init_index_vue_vue_type_script_setup_true_lang = __esmMin((() => {
591
679
  }
592
680
  function showEditModal(connection) {
593
681
  editingConnection.value = connection;
594
- connectionForm.value = { ...connection };
682
+ connectionForm.value = {
683
+ ...connection,
684
+ options: connection.options || {}
685
+ };
595
686
  show();
596
687
  }
597
688
  async function saveConnection(closeModal = true) {
@@ -703,31 +794,31 @@ var init_index_vue_vue_type_script_setup_true_lang = __esmMin((() => {
703
794
  onOnClose: handleModalClose
704
795
  }, {
705
796
  footer: withCtx(() => [
706
- createBaseVNode("button", _hoisted_59$4, [_cache[32] || (_cache[32] = createBaseVNode("i", { class: "bi bi-x-circle me-1" }, null, -1)), createTextVNode(toDisplayString(_ctx.$t("common.cancel")), 1)]),
797
+ createBaseVNode("button", _hoisted_71$4, [_cache[38] || (_cache[38] = createBaseVNode("i", { class: "bi bi-x-circle me-1" }, null, -1)), createTextVNode(toDisplayString(_ctx.$t("common.cancel")), 1)]),
707
798
  createBaseVNode("button", {
708
799
  type: "button",
709
800
  class: "btn btn-outline-primary",
710
- onClick: _cache[10] || (_cache[10] = ($event) => testConnection(connectionForm.value))
711
- }, [_cache[33] || (_cache[33] = createBaseVNode("i", { class: "bi bi-wifi me-1" }, null, -1)), createTextVNode(toDisplayString(_ctx.$t("connection.testConnection")), 1)]),
801
+ onClick: _cache[12] || (_cache[12] = ($event) => testConnection(connectionForm.value))
802
+ }, [_cache[39] || (_cache[39] = createBaseVNode("i", { class: "bi bi-wifi me-1" }, null, -1)), createTextVNode(toDisplayString(_ctx.$t("connection.testConnection")), 1)]),
712
803
  createBaseVNode("button", {
713
804
  type: "button",
714
805
  class: "btn btn-primary",
715
806
  onClick: saveConnection
716
- }, [_cache[34] || (_cache[34] = createBaseVNode("i", { class: "bi bi-save me-1" }, null, -1)), createTextVNode(toDisplayString(editingConnection.value ? _ctx.$t("connection.updateConfig") : _ctx.$t("connection.saveConfig")), 1)]),
807
+ }, [_cache[40] || (_cache[40] = createBaseVNode("i", { class: "bi bi-save me-1" }, null, -1)), createTextVNode(toDisplayString(editingConnection.value ? _ctx.$t("connection.updateConfig") : _ctx.$t("connection.saveConfig")), 1)]),
717
808
  createBaseVNode("button", {
718
809
  type: "button",
719
810
  class: "btn btn-success",
720
811
  onClick: saveAndTestConnection
721
- }, [_cache[35] || (_cache[35] = createBaseVNode("i", { class: "bi bi-check-circle me-1" }, null, -1)), createTextVNode(toDisplayString(_ctx.$t("connection.saveAndTest")), 1)])
812
+ }, [_cache[41] || (_cache[41] = createBaseVNode("i", { class: "bi bi-check-circle me-1" }, null, -1)), createTextVNode(toDisplayString(_ctx.$t("connection.saveAndTest")), 1)])
722
813
  ]),
723
814
  default: withCtx(() => [createBaseVNode("form", {
724
815
  onSubmit: withModifiers(saveConnection, ["prevent"]),
725
816
  class: "connection-form-modern"
726
817
  }, [
727
- createBaseVNode("div", _hoisted_1$9, [createBaseVNode("div", _hoisted_2$9, [_cache[11] || (_cache[11] = createBaseVNode("div", { class: "section-icon" }, [createBaseVNode("i", { class: "bi bi-info-circle" })], -1)), createBaseVNode("h3", _hoisted_3$9, toDisplayString(_ctx.$t("connection.basicInfo")), 1)]), createBaseVNode("div", _hoisted_4$9, [createBaseVNode("div", _hoisted_5$9, [createBaseVNode("div", _hoisted_6$9, [createBaseVNode("label", _hoisted_7$9, [
728
- _cache[12] || (_cache[12] = createBaseVNode("i", { class: "bi bi-tag me-2" }, null, -1)),
818
+ createBaseVNode("div", _hoisted_1$9, [createBaseVNode("div", _hoisted_2$9, [_cache[13] || (_cache[13] = createBaseVNode("div", { class: "section-icon" }, [createBaseVNode("i", { class: "bi bi-info-circle" })], -1)), createBaseVNode("h3", _hoisted_3$9, toDisplayString(_ctx.$t("connection.basicInfo")), 1)]), createBaseVNode("div", _hoisted_4$9, [createBaseVNode("div", _hoisted_5$9, [createBaseVNode("div", _hoisted_6$9, [createBaseVNode("label", _hoisted_7$9, [
819
+ _cache[14] || (_cache[14] = createBaseVNode("i", { class: "bi bi-tag me-2" }, null, -1)),
729
820
  createTextVNode(toDisplayString(_ctx.$t("connection.connectionName")) + " ", 1),
730
- _cache[13] || (_cache[13] = createBaseVNode("span", { class: "required" }, "*", -1))
821
+ _cache[15] || (_cache[15] = createBaseVNode("span", { class: "required" }, "*", -1))
731
822
  ]), withDirectives(createBaseVNode("input", {
732
823
  type: "text",
733
824
  class: "form-control-modern",
@@ -735,9 +826,9 @@ var init_index_vue_vue_type_script_setup_true_lang = __esmMin((() => {
735
826
  placeholder: _ctx.$t("connection.connectionNamePlaceholder"),
736
827
  required: ""
737
828
  }, null, 8, _hoisted_8$9), [[vModelText, connectionForm.value.name]])]), createBaseVNode("div", _hoisted_9$9, [createBaseVNode("label", _hoisted_10$9, [
738
- _cache[14] || (_cache[14] = createBaseVNode("i", { class: "bi bi-diagram-3 me-2" }, null, -1)),
829
+ _cache[16] || (_cache[16] = createBaseVNode("i", { class: "bi bi-diagram-3 me-2" }, null, -1)),
739
830
  createTextVNode(toDisplayString(_ctx.$t("connection.databaseType")) + " ", 1),
740
- _cache[15] || (_cache[15] = createBaseVNode("span", { class: "required" }, "*", -1))
831
+ _cache[17] || (_cache[17] = createBaseVNode("span", { class: "required" }, "*", -1))
741
832
  ]), withDirectives(createBaseVNode("select", {
742
833
  class: "form-select-modern",
743
834
  "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => connectionForm.value.type = $event),
@@ -749,11 +840,11 @@ var init_index_vue_vue_type_script_setup_true_lang = __esmMin((() => {
749
840
  value: dbType.value
750
841
  }, toDisplayString(dbType.label), 9, _hoisted_12$9);
751
842
  }), 128))], 544), [[vModelSelect, connectionForm.value.type]])])])])]),
752
- connectionForm.value.type !== "sqlite" ? (openBlock(), createElementBlock("div", _hoisted_13$9, [createBaseVNode("div", _hoisted_14$9, [_cache[16] || (_cache[16] = createBaseVNode("div", { class: "section-icon" }, [createBaseVNode("i", { class: "bi bi-hdd-network" })], -1)), createBaseVNode("h3", _hoisted_15$9, toDisplayString(_ctx.$t("connection.connectionConfig")), 1)]), createBaseVNode("div", _hoisted_16$9, [createBaseVNode("div", _hoisted_17$9, [
843
+ connectionForm.value.type !== "sqlite" && connectionForm.value.type !== "remote" ? (openBlock(), createElementBlock("div", _hoisted_13$9, [createBaseVNode("div", _hoisted_14$9, [_cache[18] || (_cache[18] = createBaseVNode("div", { class: "section-icon" }, [createBaseVNode("i", { class: "bi bi-hdd-network" })], -1)), createBaseVNode("h3", _hoisted_15$9, toDisplayString(_ctx.$t("connection.connectionConfig")), 1)]), createBaseVNode("div", _hoisted_16$9, [createBaseVNode("div", _hoisted_17$9, [
753
844
  createBaseVNode("div", _hoisted_18$9, [createBaseVNode("label", _hoisted_19$9, [
754
- _cache[17] || (_cache[17] = createBaseVNode("i", { class: "bi bi-server me-2" }, null, -1)),
845
+ _cache[19] || (_cache[19] = createBaseVNode("i", { class: "bi bi-server me-2" }, null, -1)),
755
846
  createTextVNode(toDisplayString(_ctx.$t("connection.host")) + " ", 1),
756
- _cache[18] || (_cache[18] = createBaseVNode("span", { class: "required" }, "*", -1))
847
+ _cache[20] || (_cache[20] = createBaseVNode("span", { class: "required" }, "*", -1))
757
848
  ]), withDirectives(createBaseVNode("input", {
758
849
  type: "text",
759
850
  class: "form-control-modern",
@@ -762,9 +853,9 @@ var init_index_vue_vue_type_script_setup_true_lang = __esmMin((() => {
762
853
  required: ""
763
854
  }, null, 8, _hoisted_20$8), [[vModelText, connectionForm.value.host]])]),
764
855
  createBaseVNode("div", _hoisted_21$8, [createBaseVNode("label", _hoisted_22$8, [
765
- _cache[19] || (_cache[19] = createBaseVNode("i", { class: "bi bi-door-closed me-2" }, null, -1)),
856
+ _cache[21] || (_cache[21] = createBaseVNode("i", { class: "bi bi-door-closed me-2" }, null, -1)),
766
857
  createTextVNode(toDisplayString(_ctx.$t("connection.port")) + " ", 1),
767
- _cache[20] || (_cache[20] = createBaseVNode("span", { class: "required" }, "*", -1))
858
+ _cache[22] || (_cache[22] = createBaseVNode("span", { class: "required" }, "*", -1))
768
859
  ]), withDirectives(createBaseVNode("input", {
769
860
  type: "number",
770
861
  class: "form-control-modern",
@@ -780,9 +871,9 @@ var init_index_vue_vue_type_script_setup_true_lang = __esmMin((() => {
780
871
  { number: true }
781
872
  ]])]),
782
873
  createBaseVNode("div", _hoisted_24$8, [createBaseVNode("label", _hoisted_25$8, [
783
- _cache[21] || (_cache[21] = createBaseVNode("i", { class: "bi bi-database me-2" }, null, -1)),
874
+ _cache[23] || (_cache[23] = createBaseVNode("i", { class: "bi bi-database me-2" }, null, -1)),
784
875
  createTextVNode(toDisplayString(_ctx.$t("connection.databaseName")) + " ", 1),
785
- _cache[22] || (_cache[22] = createBaseVNode("span", { class: "required" }, "*", -1))
876
+ _cache[24] || (_cache[24] = createBaseVNode("span", { class: "required" }, "*", -1))
786
877
  ]), withDirectives(createBaseVNode("input", {
787
878
  type: "text",
788
879
  class: "form-control-modern",
@@ -790,7 +881,7 @@ var init_index_vue_vue_type_script_setup_true_lang = __esmMin((() => {
790
881
  placeholder: _ctx.$t("connection.databaseNamePlaceholder"),
791
882
  required: ""
792
883
  }, null, 8, _hoisted_26$7), [[vModelText, connectionForm.value.database]])]),
793
- createBaseVNode("div", _hoisted_27$7, [createBaseVNode("label", _hoisted_28$7, [_cache[23] || (_cache[23] = createBaseVNode("i", { class: "bi bi-clock me-2" }, null, -1)), createTextVNode(toDisplayString(_ctx.$t("connection.connectionTimeout")), 1)]), withDirectives(createBaseVNode("input", {
884
+ createBaseVNode("div", _hoisted_27$7, [createBaseVNode("label", _hoisted_28$7, [_cache[25] || (_cache[25] = createBaseVNode("i", { class: "bi bi-clock me-2" }, null, -1)), createTextVNode(toDisplayString(_ctx.$t("connection.connectionTimeout")), 1)]), withDirectives(createBaseVNode("input", {
794
885
  type: "number",
795
886
  class: "form-control-modern",
796
887
  "onUpdate:modelValue": _cache[5] || (_cache[5] = ($event) => connectionForm.value.options.timeout = $event),
@@ -803,10 +894,10 @@ var init_index_vue_vue_type_script_setup_true_lang = __esmMin((() => {
803
894
  { number: true }
804
895
  ]])])
805
896
  ])])])) : createCommentVNode("", true),
806
- connectionForm.value.type === "sqlite" ? (openBlock(), createElementBlock("div", _hoisted_30$6, [createBaseVNode("div", _hoisted_31$6, [_cache[24] || (_cache[24] = createBaseVNode("div", { class: "section-icon" }, [createBaseVNode("i", { class: "bi bi-file-earmark-text" })], -1)), createBaseVNode("h3", _hoisted_32$6, toDisplayString(_ctx.$t("connection.sqliteConfig")), 1)]), createBaseVNode("div", _hoisted_33$6, [createBaseVNode("div", _hoisted_34$6, [createBaseVNode("div", _hoisted_35$6, [createBaseVNode("label", _hoisted_36$6, [
807
- _cache[25] || (_cache[25] = createBaseVNode("i", { class: "bi bi-file-earmark me-2" }, null, -1)),
897
+ connectionForm.value.type === "sqlite" ? (openBlock(), createElementBlock("div", _hoisted_30$6, [createBaseVNode("div", _hoisted_31$6, [_cache[26] || (_cache[26] = createBaseVNode("div", { class: "section-icon" }, [createBaseVNode("i", { class: "bi bi-file-earmark-text" })], -1)), createBaseVNode("h3", _hoisted_32$6, toDisplayString(_ctx.$t("connection.sqliteConfig")), 1)]), createBaseVNode("div", _hoisted_33$6, [createBaseVNode("div", _hoisted_34$6, [createBaseVNode("div", _hoisted_35$6, [createBaseVNode("label", _hoisted_36$6, [
898
+ _cache[27] || (_cache[27] = createBaseVNode("i", { class: "bi bi-file-earmark me-2" }, null, -1)),
808
899
  createTextVNode(toDisplayString(_ctx.$t("connection.databaseFile")) + " ", 1),
809
- _cache[26] || (_cache[26] = createBaseVNode("span", { class: "required" }, "*", -1))
900
+ _cache[28] || (_cache[28] = createBaseVNode("span", { class: "required" }, "*", -1))
810
901
  ]), withDirectives(createBaseVNode("input", {
811
902
  type: "text",
812
903
  class: "form-control-modern",
@@ -814,23 +905,39 @@ var init_index_vue_vue_type_script_setup_true_lang = __esmMin((() => {
814
905
  placeholder: _ctx.$t("connection.databaseFilePlaceholder"),
815
906
  required: ""
816
907
  }, null, 8, _hoisted_37$6), [[vModelText, connectionForm.value.database]])])])])])) : createCommentVNode("", true),
817
- createBaseVNode("div", _hoisted_38$6, [createBaseVNode("div", _hoisted_39$6, [_cache[27] || (_cache[27] = createBaseVNode("div", { class: "section-icon" }, [createBaseVNode("i", { class: "bi bi-shield-lock" })], -1)), createBaseVNode("h3", _hoisted_40$6, toDisplayString(_ctx.$t("connection.authInfo")), 1)]), createBaseVNode("div", _hoisted_41$6, [createBaseVNode("div", _hoisted_42$6, [createBaseVNode("div", _hoisted_43$6, [createBaseVNode("label", _hoisted_44$6, [_cache[28] || (_cache[28] = createBaseVNode("i", { class: "bi bi-person me-2" }, null, -1)), createTextVNode(toDisplayString(_ctx.$t("connection.username")), 1)]), withDirectives(createBaseVNode("input", {
908
+ connectionForm.value.type === "remote" ? (openBlock(), createElementBlock("div", _hoisted_38$6, [createBaseVNode("div", _hoisted_39$6, [_cache[29] || (_cache[29] = createBaseVNode("div", { class: "section-icon" }, [createBaseVNode("i", { class: "bi bi-cloud" })], -1)), createBaseVNode("h3", _hoisted_40$6, toDisplayString(_ctx.$t("connection.remoteConfig")), 1)]), createBaseVNode("div", _hoisted_41$6, [createBaseVNode("div", _hoisted_42$6, [createBaseVNode("div", _hoisted_43$6, [createBaseVNode("label", _hoisted_44$6, [
909
+ _cache[30] || (_cache[30] = createBaseVNode("i", { class: "bi bi-hdd-network me-2" }, null, -1)),
910
+ createTextVNode(toDisplayString(_ctx.$t("connection.remoteUrl")) + " ", 1),
911
+ _cache[31] || (_cache[31] = createBaseVNode("span", { class: "required" }, "*", -1))
912
+ ]), withDirectives(createBaseVNode("input", {
818
913
  type: "text",
819
914
  class: "form-control-modern",
820
- "onUpdate:modelValue": _cache[7] || (_cache[7] = ($event) => connectionForm.value.username = $event),
915
+ "onUpdate:modelValue": _cache[7] || (_cache[7] = ($event) => connectionForm.value.options.remoteUrl = $event),
916
+ placeholder: _ctx.$t("connection.remoteUrlPlaceholder"),
917
+ required: ""
918
+ }, null, 8, _hoisted_45$6), [[vModelText, connectionForm.value.options.remoteUrl]])]), createBaseVNode("div", _hoisted_46$6, [createBaseVNode("label", _hoisted_47$5, [_cache[32] || (_cache[32] = createBaseVNode("i", { class: "bi bi-key me-2" }, null, -1)), createTextVNode(toDisplayString(_ctx.$t("connection.remoteToken")), 1)]), withDirectives(createBaseVNode("input", {
919
+ type: "password",
920
+ class: "form-control-modern",
921
+ "onUpdate:modelValue": _cache[8] || (_cache[8] = ($event) => connectionForm.value.options.remoteToken = $event),
922
+ placeholder: _ctx.$t("connection.remoteTokenPlaceholder")
923
+ }, null, 8, _hoisted_48$5), [[vModelText, connectionForm.value.options.remoteToken]])])]), createBaseVNode("p", _hoisted_49$5, toDisplayString(_ctx.$t("connection.remoteConfigHint")), 1)])])) : createCommentVNode("", true),
924
+ createBaseVNode("div", _hoisted_50$5, [createBaseVNode("div", _hoisted_51$5, [_cache[33] || (_cache[33] = createBaseVNode("div", { class: "section-icon" }, [createBaseVNode("i", { class: "bi bi-shield-lock" })], -1)), createBaseVNode("h3", _hoisted_52$5, toDisplayString(_ctx.$t("connection.authInfo")), 1)]), createBaseVNode("div", _hoisted_53$5, [createBaseVNode("div", _hoisted_54$5, [createBaseVNode("div", _hoisted_55$5, [createBaseVNode("label", _hoisted_56$5, [_cache[34] || (_cache[34] = createBaseVNode("i", { class: "bi bi-person me-2" }, null, -1)), createTextVNode(toDisplayString(_ctx.$t("connection.username")), 1)]), withDirectives(createBaseVNode("input", {
925
+ type: "text",
926
+ class: "form-control-modern",
927
+ "onUpdate:modelValue": _cache[9] || (_cache[9] = ($event) => connectionForm.value.username = $event),
821
928
  placeholder: _ctx.$t("connection.usernamePlaceholder")
822
- }, null, 8, _hoisted_45$6), [[vModelText, connectionForm.value.username]])]), createBaseVNode("div", _hoisted_46$6, [createBaseVNode("label", _hoisted_47$6, [_cache[29] || (_cache[29] = createBaseVNode("i", { class: "bi bi-key me-2" }, null, -1)), createTextVNode(toDisplayString(_ctx.$t("connection.password")), 1)]), withDirectives(createBaseVNode("input", {
929
+ }, null, 8, _hoisted_57$4), [[vModelText, connectionForm.value.username]])]), createBaseVNode("div", _hoisted_58$4, [createBaseVNode("label", _hoisted_59$4, [_cache[35] || (_cache[35] = createBaseVNode("i", { class: "bi bi-key me-2" }, null, -1)), createTextVNode(toDisplayString(_ctx.$t("connection.password")), 1)]), withDirectives(createBaseVNode("input", {
823
930
  type: "password",
824
931
  class: "form-control-modern",
825
- "onUpdate:modelValue": _cache[8] || (_cache[8] = ($event) => connectionForm.value.password = $event),
932
+ "onUpdate:modelValue": _cache[10] || (_cache[10] = ($event) => connectionForm.value.password = $event),
826
933
  placeholder: _ctx.$t("connection.passwordPlaceholder")
827
- }, null, 8, _hoisted_48$5), [[vModelText, connectionForm.value.password]])])])])]),
828
- createBaseVNode("div", _hoisted_49$5, [createBaseVNode("div", _hoisted_50$5, [_cache[30] || (_cache[30] = createBaseVNode("div", { class: "section-icon" }, [createBaseVNode("i", { class: "bi bi-gear" })], -1)), createBaseVNode("h3", _hoisted_51$5, toDisplayString(_ctx.$t("connection.otherOptions")), 1)]), createBaseVNode("div", _hoisted_52$5, [createBaseVNode("div", _hoisted_53$5, [createBaseVNode("label", _hoisted_54$4, [_cache[31] || (_cache[31] = createBaseVNode("i", { class: "bi bi-toggle-on me-2" }, null, -1)), createTextVNode(toDisplayString(_ctx.$t("connection.connectionStatus")), 1)]), createBaseVNode("div", _hoisted_55$4, [withDirectives(createBaseVNode("input", {
934
+ }, null, 8, _hoisted_60$4), [[vModelText, connectionForm.value.password]])])])])]),
935
+ createBaseVNode("div", _hoisted_61$4, [createBaseVNode("div", _hoisted_62$4, [_cache[36] || (_cache[36] = createBaseVNode("div", { class: "section-icon" }, [createBaseVNode("i", { class: "bi bi-gear" })], -1)), createBaseVNode("h3", _hoisted_63$4, toDisplayString(_ctx.$t("connection.otherOptions")), 1)]), createBaseVNode("div", _hoisted_64$4, [createBaseVNode("div", _hoisted_65$4, [createBaseVNode("label", _hoisted_66$4, [_cache[37] || (_cache[37] = createBaseVNode("i", { class: "bi bi-toggle-on me-2" }, null, -1)), createTextVNode(toDisplayString(_ctx.$t("connection.connectionStatus")), 1)]), createBaseVNode("div", _hoisted_67$4, [withDirectives(createBaseVNode("input", {
829
936
  class: "form-check-input-modern",
830
937
  type: "checkbox",
831
- "onUpdate:modelValue": _cache[9] || (_cache[9] = ($event) => connectionForm.value.enabled = $event),
938
+ "onUpdate:modelValue": _cache[11] || (_cache[11] = ($event) => connectionForm.value.enabled = $event),
832
939
  id: "enabled"
833
- }, null, 512), [[vModelCheckbox, connectionForm.value.enabled]]), createBaseVNode("label", _hoisted_56$4, [createBaseVNode("span", _hoisted_57$4, toDisplayString(_ctx.$t("connection.enableConnection")), 1), createBaseVNode("span", _hoisted_58$4, toDisplayString(_ctx.$t("connection.enableConnectionDesc")), 1)])])])])])
940
+ }, null, 512), [[vModelCheckbox, connectionForm.value.enabled]]), createBaseVNode("label", _hoisted_68$4, [createBaseVNode("span", _hoisted_69$4, toDisplayString(_ctx.$t("connection.enableConnection")), 1), createBaseVNode("span", _hoisted_70$4, toDisplayString(_ctx.$t("connection.enableConnectionDesc")), 1)])])])])])
834
941
  ], 32)]),
835
942
  _: 1
836
943
  }, 8, ["title", "closeButton"]), createVNode(modal_default, {
@@ -847,11 +954,12 @@ var init_index_vue_vue_type_script_setup_true_lang = __esmMin((() => {
847
954
  },
848
955
  isFullScreen: false,
849
956
  style: {
850
- maxWidth: "400px!important",
851
- width: "100%"
957
+ maxWidth: "400px",
958
+ width: "100%",
959
+ margin: "auto"
852
960
  }
853
961
  }, {
854
- default: withCtx(() => [createBaseVNode("div", _hoisted_60$4, [_cache[36] || (_cache[36] = createBaseVNode("div", { class: "error-icon" }, [createBaseVNode("i", { class: "bi bi-exclamation-triangle" })], -1)), createBaseVNode("div", _hoisted_61$4, toDisplayString(errorMessage.value), 1)])]),
962
+ default: withCtx(() => [createBaseVNode("div", _hoisted_72$3, [_cache[42] || (_cache[42] = createBaseVNode("div", { class: "error-icon" }, [createBaseVNode("i", { class: "bi bi-exclamation-triangle" })], -1)), createBaseVNode("div", _hoisted_73$3, toDisplayString(errorMessage.value), 1)])]),
855
963
  _: 1
856
964
  }, 8, ["title", "closeButton"])], 64);
857
965
  };
@@ -859,17 +967,17 @@ var init_index_vue_vue_type_script_setup_true_lang = __esmMin((() => {
859
967
  });
860
968
  }));
861
969
  //#endregion
862
- //#region src/components/connection-editor/index.vue?vue&type=style&index=0&scoped=7681a313&lang.css
863
- var init_index_vue_vue_type_style_index_0_scoped_7681a313_lang = __esmMin((() => {}));
970
+ //#region src/components/connection-editor/index.vue?vue&type=style&index=0&scoped=c314aadc&lang.css
971
+ var init_index_vue_vue_type_style_index_0_scoped_c314aadc_lang = __esmMin((() => {}));
864
972
  //#endregion
865
973
  //#region src/components/connection-editor/index.vue
866
974
  var connection_editor_default;
867
975
  var init_connection_editor = __esmMin((() => {
868
976
  init_index_vue_vue_type_script_setup_true_lang();
869
977
  init_index_vue_vue_type_script_setup_true_lang();
870
- init_index_vue_vue_type_style_index_0_scoped_7681a313_lang();
978
+ init_index_vue_vue_type_style_index_0_scoped_c314aadc_lang();
871
979
  init__plugin_vue_export_helper();
872
- connection_editor_default = /*#__PURE__*/ _plugin_vue_export_helper_default(index_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-7681a313"]]);
980
+ connection_editor_default = /*#__PURE__*/ _plugin_vue_export_helper_default(index_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-c314aadc"]]);
873
981
  })), ModalHelper, modal;
874
982
  var init_modal = __esmMin((() => {
875
983
  init_vue_runtime_esm_bundler();
@@ -53117,6 +53225,63 @@ function onThemeChange(cb) {
53117
53225
  }
53118
53226
  var init_theme = __esmMin((() => {}));
53119
53227
  //#endregion
53228
+ //#region src/platform/database/utils/helpers.ts
53229
+ async function copyToClipboard(text) {
53230
+ try {
53231
+ await navigator.clipboard.writeText(text);
53232
+ return true;
53233
+ } catch (error) {
53234
+ const textArea = document.createElement("textarea");
53235
+ textArea.value = text;
53236
+ textArea.style.position = "fixed";
53237
+ textArea.style.opacity = "0";
53238
+ document.body.appendChild(textArea);
53239
+ textArea.focus();
53240
+ textArea.select();
53241
+ try {
53242
+ document.execCommand("copy");
53243
+ document.body.removeChild(textArea);
53244
+ return true;
53245
+ } catch (error) {
53246
+ document.body.removeChild(textArea);
53247
+ return false;
53248
+ }
53249
+ }
53250
+ }
53251
+ var init_helpers = __esmMin((() => {}));
53252
+ //#endregion
53253
+ //#region src/platform/database/utils/cm-clipboard.ts
53254
+ function copyOrCut(view, cut) {
53255
+ const { state } = view;
53256
+ const sel = state.selection.main;
53257
+ if (sel.empty) return false;
53258
+ copyToClipboard(state.sliceDoc(sel.from, sel.to));
53259
+ if (cut && !state.facet(EditorState.readOnly)) view.dispatch({
53260
+ changes: {
53261
+ from: sel.from,
53262
+ to: sel.to,
53263
+ insert: ""
53264
+ },
53265
+ selection: { anchor: sel.from }
53266
+ });
53267
+ return true;
53268
+ }
53269
+ var clipboardKeymap;
53270
+ var init_cm_clipboard = __esmMin((() => {
53271
+ init_dist$10();
53272
+ init_dist$11();
53273
+ init_helpers();
53274
+ clipboardKeymap = keymap.of([{
53275
+ key: "Mod-c",
53276
+ preventDefault: true,
53277
+ run: (v) => copyOrCut(v, false)
53278
+ }, {
53279
+ key: "Mod-x",
53280
+ preventDefault: true,
53281
+ run: (v) => copyOrCut(v, true)
53282
+ }]);
53283
+ }));
53284
+ //#endregion
53120
53285
  //#region src/platform/database/components/sql-executor.vue?vue&type=script&setup=true&lang.ts
53121
53286
  var _hoisted_1$8, _hoisted_2$8, _hoisted_3$8, _hoisted_4$8, _hoisted_5$8, _hoisted_6$8, _hoisted_7$8, _hoisted_8$8, _hoisted_9$8, _hoisted_10$8, _hoisted_11$8, _hoisted_12$8, _hoisted_13$8, _hoisted_14$8, _hoisted_15$8, _hoisted_16$8, _hoisted_17$8, _hoisted_18$8, _hoisted_19$8, sql_executor_vue_vue_type_script_setup_true_lang_default;
53122
53287
  var init_sql_executor_vue_vue_type_script_setup_true_lang = __esmMin((() => {
@@ -53133,6 +53298,7 @@ var init_sql_executor_vue_vue_type_script_setup_true_lang = __esmMin((() => {
53133
53298
  init_modal();
53134
53299
  init_export();
53135
53300
  init_theme();
53301
+ init_cm_clipboard();
53136
53302
  _hoisted_1$8 = { class: "sql-executor" };
53137
53303
  _hoisted_2$8 = { class: "sql-toolbar" };
53138
53304
  _hoisted_3$8 = { class: "toolbar-left" };
@@ -53314,6 +53480,7 @@ var init_sql_executor_vue_vue_type_script_setup_true_lang = __esmMin((() => {
53314
53480
  placeholder(t("sqlExecutor.inputSQLPlaceholder")),
53315
53481
  sql(),
53316
53482
  ...isDarkTheme() ? [oneDark] : [],
53483
+ clipboardKeymap,
53317
53484
  keymap.of(defaultKeymap),
53318
53485
  EditorView.updateListener.of((update) => {
53319
53486
  if (update.docChanged) sqlQuery.value = update.state.doc.toString();
@@ -53356,6 +53523,7 @@ var init_sql_executor_vue_vue_type_script_setup_true_lang = __esmMin((() => {
53356
53523
  placeholder(t("sqlExecutor.resultPlaceholder")),
53357
53524
  json(),
53358
53525
  syntaxHighlighting(defaultHighlightStyle),
53526
+ clipboardKeymap,
53359
53527
  keymap.of(defaultKeymap),
53360
53528
  EditorView.lineWrapping,
53361
53529
  EditorState.readOnly.of(true),
@@ -53462,7 +53630,7 @@ var init_sql_executor_vue_vue_type_script_setup_true_lang = __esmMin((() => {
53462
53630
  class: "btn btn-outline-secondary btn-sm",
53463
53631
  onClick: formatSql
53464
53632
  }, [_cache[2] || (_cache[2] = createBaseVNode("i", { class: "bi bi-braces" }, null, -1)), createTextVNode(" " + toDisplayString(_ctx.$t("common.format")), 1)])]), createBaseVNode("div", _hoisted_5$8, [createBaseVNode("button", {
53465
- class: "btn btn-outline-primary btn-sm",
53633
+ class: "btn btn-outline-secondary btn-sm",
53466
53634
  onClick: clearSql
53467
53635
  }, [_cache[3] || (_cache[3] = createBaseVNode("i", { class: "bi bi-trash" }, null, -1)), createTextVNode(" " + toDisplayString(_ctx.$t("sqlExecutor.clearBtn")), 1)])])]), createBaseVNode("div", {
53468
53636
  class: "sql-container",
@@ -53499,21 +53667,90 @@ var init_sql_executor_vue_vue_type_script_setup_true_lang = __esmMin((() => {
53499
53667
  });
53500
53668
  }));
53501
53669
  //#endregion
53502
- //#region src/platform/database/components/sql-executor.vue?vue&type=style&index=0&scoped=4b956460&lang.css
53503
- var init_sql_executor_vue_vue_type_style_index_0_scoped_4b956460_lang = __esmMin((() => {}));
53670
+ //#region src/platform/database/components/sql-executor.vue?vue&type=style&index=0&scoped=601319e8&lang.css
53671
+ var init_sql_executor_vue_vue_type_style_index_0_scoped_601319e8_lang = __esmMin((() => {}));
53504
53672
  //#endregion
53505
53673
  //#region src/platform/database/components/sql-executor.vue
53506
53674
  var sql_executor_default;
53507
53675
  var init_sql_executor = __esmMin((() => {
53508
53676
  init_sql_executor_vue_vue_type_script_setup_true_lang();
53509
53677
  init_sql_executor_vue_vue_type_script_setup_true_lang();
53510
- init_sql_executor_vue_vue_type_style_index_0_scoped_4b956460_lang();
53678
+ init_sql_executor_vue_vue_type_style_index_0_scoped_601319e8_lang();
53511
53679
  init__plugin_vue_export_helper();
53512
- sql_executor_default = /*#__PURE__*/ _plugin_vue_export_helper_default(sql_executor_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-4b956460"]]);
53680
+ sql_executor_default = /*#__PURE__*/ _plugin_vue_export_helper_default(sql_executor_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-601319e8"]]);
53681
+ }));
53682
+ //#endregion
53683
+ //#region src/utils/download.ts
53684
+ /**
53685
+ * 保存文本内容为文件。
53686
+ * @param filename 建议文件名(含扩展名)
53687
+ * @param content 文本内容
53688
+ * @param filters 保存对话框的扩展名过滤,如 { SQL: ['sql'] }
53689
+ */
53690
+ async function saveTextFile(filename, content, filters) {
53691
+ if (isVSCodeEnvironment()) return saveViaHost(filename, content, filters);
53692
+ downloadInBrowser(filename, content);
53693
+ return {};
53694
+ }
53695
+ function downloadInBrowser(filename, content) {
53696
+ const blob = new Blob([content], { type: "text/plain;charset=utf-8" });
53697
+ const url = URL.createObjectURL(blob);
53698
+ const a = document.createElement("a");
53699
+ a.href = url;
53700
+ a.download = filename;
53701
+ a.style.display = "none";
53702
+ document.body.appendChild(a);
53703
+ a.click();
53704
+ a.remove();
53705
+ setTimeout(() => URL.revokeObjectURL(url), 1e3);
53706
+ }
53707
+ /**
53708
+ * 走宿主保存:saveFile → saveFileResult(按 id 配对)。
53709
+ *
53710
+ * 直接挂一次性 window 监听而不用 bridge.onMessage:
53711
+ * 后者只加不移,反复保存会累积无效的监听器。
53712
+ * 同样不做 origin 过滤(与 bridge.onMessage 保持一致)。
53713
+ */
53714
+ function saveViaHost(filename, content, filters) {
53715
+ const bridge = getVSCodeBridge();
53716
+ const id = ++seq;
53717
+ return new Promise((resolve, reject) => {
53718
+ const timer = setTimeout(() => {
53719
+ window.removeEventListener("message", handler);
53720
+ reject(/* @__PURE__ */ new Error("保存文件超时"));
53721
+ }, 12e4);
53722
+ const handler = (event) => {
53723
+ const msg = event.data;
53724
+ if (!msg || msg.command !== "saveFileResult" || msg.id !== id) return;
53725
+ window.removeEventListener("message", handler);
53726
+ clearTimeout(timer);
53727
+ const data = msg.data || {};
53728
+ if (data.error) reject(new Error(data.error));
53729
+ else resolve({
53730
+ path: data.path || void 0,
53731
+ cancelled: !!data.cancelled
53732
+ });
53733
+ };
53734
+ window.addEventListener("message", handler);
53735
+ bridge.postMessage({
53736
+ command: "saveFile",
53737
+ id,
53738
+ data: {
53739
+ filename,
53740
+ content,
53741
+ filters
53742
+ }
53743
+ });
53744
+ });
53745
+ }
53746
+ var seq;
53747
+ var init_download = __esmMin((() => {
53748
+ init_bridge();
53749
+ seq = 0;
53513
53750
  }));
53514
53751
  //#endregion
53515
53752
  //#region src/platform/database/components/connection-detail.vue?vue&type=script&setup=true&lang.ts
53516
- var _hoisted_1$7, _hoisted_2$7, _hoisted_3$7, _hoisted_4$7, _hoisted_5$7, _hoisted_6$7, _hoisted_7$7, _hoisted_8$7, _hoisted_9$7, _hoisted_10$7, _hoisted_11$7, _hoisted_12$7, _hoisted_13$7, _hoisted_14$7, _hoisted_15$7, _hoisted_16$7, _hoisted_17$7, _hoisted_18$7, _hoisted_19$7, _hoisted_20$7, _hoisted_21$7, _hoisted_22$7, _hoisted_23$7, _hoisted_24$7, _hoisted_25$7, _hoisted_26$6, _hoisted_27$6, _hoisted_28$6, _hoisted_29$6, _hoisted_30$5, _hoisted_31$5, _hoisted_32$5, _hoisted_33$5, _hoisted_34$5, _hoisted_35$5, _hoisted_36$5, _hoisted_37$5, _hoisted_38$5, _hoisted_39$5, _hoisted_40$5, _hoisted_41$5, _hoisted_42$5, _hoisted_43$5, _hoisted_44$5, _hoisted_45$5, _hoisted_46$5, _hoisted_47$5, _hoisted_48$4, _hoisted_49$4, _hoisted_50$4, _hoisted_51$4, _hoisted_52$4, _hoisted_53$4, _hoisted_54$3, _hoisted_55$3, _hoisted_56$3, _hoisted_57$3, _hoisted_58$3, _hoisted_59$3, _hoisted_60$3, _hoisted_61$3, _hoisted_62$3, _hoisted_63$3, _hoisted_64$3, _hoisted_65$3, _hoisted_66$3, _hoisted_67$3, _hoisted_68$3, _hoisted_69$3, _hoisted_70$3, _hoisted_71$3, _hoisted_72$3, _hoisted_73$3, _hoisted_74$2, _hoisted_75$2, _hoisted_76$2, _hoisted_77$2, _hoisted_78$2, _hoisted_79$2, _hoisted_80$2, _hoisted_81$2, _hoisted_82$2, _hoisted_83$2, _hoisted_84$2, _hoisted_85$2, _hoisted_86$2, _hoisted_87$2, _hoisted_88$2, _hoisted_89$2, _hoisted_90$2, _hoisted_91$2, _hoisted_92$2, _hoisted_93$2, _hoisted_94$2, _hoisted_95$2, _hoisted_96$2, _hoisted_97$2, _hoisted_98$2, _hoisted_99$2, _hoisted_100$2, _hoisted_101$2, _hoisted_102$2, _hoisted_103$2, _hoisted_104$2, _hoisted_105$2, _hoisted_106$2, _hoisted_107$2, _hoisted_108$2, _hoisted_109$1, _hoisted_110$1, _hoisted_111$1, _hoisted_112$1, connection_detail_vue_vue_type_script_setup_true_lang_default;
53753
+ var _hoisted_1$7, _hoisted_2$7, _hoisted_3$7, _hoisted_4$7, _hoisted_5$7, _hoisted_6$7, _hoisted_7$7, _hoisted_8$7, _hoisted_9$7, _hoisted_10$7, _hoisted_11$7, _hoisted_12$7, _hoisted_13$7, _hoisted_14$7, _hoisted_15$7, _hoisted_16$7, _hoisted_17$7, _hoisted_18$7, _hoisted_19$7, _hoisted_20$7, _hoisted_21$7, _hoisted_22$7, _hoisted_23$7, _hoisted_24$7, _hoisted_25$7, _hoisted_26$6, _hoisted_27$6, _hoisted_28$6, _hoisted_29$6, _hoisted_30$5, _hoisted_31$5, _hoisted_32$5, _hoisted_33$5, _hoisted_34$5, _hoisted_35$5, _hoisted_36$5, _hoisted_37$5, _hoisted_38$5, _hoisted_39$5, _hoisted_40$5, _hoisted_41$5, _hoisted_42$5, _hoisted_43$5, _hoisted_44$5, _hoisted_45$5, _hoisted_46$5, _hoisted_47$4, _hoisted_48$4, _hoisted_49$4, _hoisted_50$4, _hoisted_51$4, _hoisted_52$4, _hoisted_53$4, _hoisted_54$4, _hoisted_55$4, _hoisted_56$4, _hoisted_57$3, _hoisted_58$3, _hoisted_59$3, _hoisted_60$3, _hoisted_61$3, _hoisted_62$3, _hoisted_63$3, _hoisted_64$3, _hoisted_65$3, _hoisted_66$3, _hoisted_67$3, _hoisted_68$3, _hoisted_69$3, _hoisted_70$3, _hoisted_71$3, _hoisted_72$2, _hoisted_73$2, _hoisted_74$2, _hoisted_75$2, _hoisted_76$2, _hoisted_77$2, _hoisted_78$2, _hoisted_79$2, _hoisted_80$2, _hoisted_81$2, _hoisted_82$2, _hoisted_83$2, _hoisted_84$2, _hoisted_85$2, _hoisted_86$2, _hoisted_87$2, _hoisted_88$2, _hoisted_89$2, _hoisted_90$2, _hoisted_91$2, _hoisted_92$2, _hoisted_93$2, _hoisted_94$2, _hoisted_95$2, _hoisted_96$2, _hoisted_97$2, _hoisted_98$2, _hoisted_99$2, _hoisted_100$2, _hoisted_101$2, _hoisted_102$2, _hoisted_103$2, _hoisted_104$2, _hoisted_105$2, _hoisted_106$2, _hoisted_107$2, _hoisted_108$2, _hoisted_109$1, _hoisted_110$1, _hoisted_111$1, _hoisted_112$1, _hoisted_113$1, _hoisted_114$1, _hoisted_115$1, _hoisted_116$1, _hoisted_117$1, _hoisted_118$1, _hoisted_119$1, _hoisted_120$1, _hoisted_121$1, _hoisted_122$1, _hoisted_123$1, _hoisted_124$1, _hoisted_125$1, _hoisted_126$1, _hoisted_127$1, _hoisted_128, _hoisted_129, _hoisted_130, _hoisted_131, _hoisted_132, _hoisted_133, connection_detail_vue_vue_type_script_setup_true_lang_default;
53517
53754
  var init_connection_detail_vue_vue_type_script_setup_true_lang = __esmMin((() => {
53518
53755
  init_vue_runtime_esm_bundler();
53519
53756
  init_vue_router();
@@ -53521,6 +53758,8 @@ var init_connection_detail_vue_vue_type_script_setup_true_lang = __esmMin((() =>
53521
53758
  init_sql_executor();
53522
53759
  init_vue_i18n();
53523
53760
  init_modal();
53761
+ init_database();
53762
+ init_download();
53524
53763
  _hoisted_1$7 = { class: "connection-detail" };
53525
53764
  _hoisted_2$7 = { class: "connection-header" };
53526
53765
  _hoisted_3$7 = { class: "connection-info" };
@@ -53544,123 +53783,172 @@ var init_connection_detail_vue_vue_type_script_setup_true_lang = __esmMin((() =>
53544
53783
  _hoisted_18$7 = { class: "info-item" };
53545
53784
  _hoisted_19$7 = { class: "info-label" };
53546
53785
  _hoisted_20$7 = { class: "info-value" };
53547
- _hoisted_21$7 = { class: "info-item" };
53786
+ _hoisted_21$7 = {
53787
+ key: 0,
53788
+ class: "info-item"
53789
+ };
53548
53790
  _hoisted_22$7 = { class: "info-label" };
53549
53791
  _hoisted_23$7 = { class: "info-value" };
53550
- _hoisted_24$7 = { class: "info-item" };
53792
+ _hoisted_24$7 = {
53793
+ key: 1,
53794
+ class: "info-item"
53795
+ };
53551
53796
  _hoisted_25$7 = { class: "info-label" };
53552
- _hoisted_26$6 = { class: "info-value" };
53797
+ _hoisted_26$6 = {
53798
+ class: "info-value",
53799
+ style: { "color": "var(--db-danger-color)" }
53800
+ };
53553
53801
  _hoisted_27$6 = { class: "info-item" };
53554
53802
  _hoisted_28$6 = { class: "info-label" };
53555
53803
  _hoisted_29$6 = { class: "info-value" };
53556
- _hoisted_30$5 = { class: "col-md-6" };
53557
- _hoisted_31$5 = { class: "section-title" };
53558
- _hoisted_32$5 = { class: "stats-grid" };
53559
- _hoisted_33$5 = { class: "stat-item" };
53560
- _hoisted_34$5 = { class: "stat-value" };
53561
- _hoisted_35$5 = { class: "stat-label" };
53562
- _hoisted_36$5 = { class: "stat-item" };
53563
- _hoisted_37$5 = { class: "stat-value" };
53564
- _hoisted_38$5 = { class: "stat-label" };
53804
+ _hoisted_30$5 = { class: "info-item" };
53805
+ _hoisted_31$5 = { class: "info-label" };
53806
+ _hoisted_32$5 = { class: "info-value" };
53807
+ _hoisted_33$5 = { class: "info-item" };
53808
+ _hoisted_34$5 = { class: "info-label" };
53809
+ _hoisted_35$5 = { class: "info-value" };
53810
+ _hoisted_36$5 = { class: "col-md-6" };
53811
+ _hoisted_37$5 = { class: "section-title" };
53812
+ _hoisted_38$5 = { class: "stats-grid" };
53565
53813
  _hoisted_39$5 = { class: "stat-item" };
53566
53814
  _hoisted_40$5 = { class: "stat-value" };
53567
53815
  _hoisted_41$5 = { class: "stat-label" };
53568
53816
  _hoisted_42$5 = { class: "stat-item" };
53569
53817
  _hoisted_43$5 = { class: "stat-value" };
53570
53818
  _hoisted_44$5 = { class: "stat-label" };
53571
- _hoisted_45$5 = { class: "quick-actions" };
53572
- _hoisted_46$5 = { class: "actions-header" };
53573
- _hoisted_47$5 = { class: "actions-title" };
53574
- _hoisted_48$4 = { class: "actions-grid" };
53575
- _hoisted_49$4 = { class: "action-text" };
53576
- _hoisted_50$4 = { class: "action-text" };
53577
- _hoisted_51$4 = { class: "action-text" };
53578
- _hoisted_52$4 = { class: "connection-tabs" };
53579
- _hoisted_53$4 = { class: "nav nav-tabs" };
53580
- _hoisted_54$3 = { class: "nav-item" };
53581
- _hoisted_55$3 = { class: "badge bg-primary ms-1" };
53582
- _hoisted_56$3 = { class: "nav-item" };
53583
- _hoisted_57$3 = { class: "tab-content" };
53584
- _hoisted_58$3 = { class: "tab-panel" };
53585
- _hoisted_59$3 = { class: "databases-section" };
53586
- _hoisted_60$3 = { class: "section-header" };
53587
- _hoisted_61$3 = { class: "db-search" };
53588
- _hoisted_62$3 = ["placeholder"];
53589
- _hoisted_63$3 = ["disabled", "title"];
53590
- _hoisted_64$3 = {
53819
+ _hoisted_45$5 = { class: "stat-item" };
53820
+ _hoisted_46$5 = { class: "stat-value" };
53821
+ _hoisted_47$4 = { class: "stat-label" };
53822
+ _hoisted_48$4 = { class: "stat-item" };
53823
+ _hoisted_49$4 = { class: "stat-value" };
53824
+ _hoisted_50$4 = { class: "stat-label" };
53825
+ _hoisted_51$4 = { class: "quick-actions" };
53826
+ _hoisted_52$4 = { class: "actions-header" };
53827
+ _hoisted_53$4 = { class: "actions-title" };
53828
+ _hoisted_54$4 = { class: "actions-grid" };
53829
+ _hoisted_55$4 = { class: "action-text" };
53830
+ _hoisted_56$4 = ["disabled"];
53831
+ _hoisted_57$3 = { class: "action-icon" };
53832
+ _hoisted_58$3 = {
53833
+ key: 0,
53834
+ class: "spinner-border spinner-border-sm"
53835
+ };
53836
+ _hoisted_59$3 = {
53837
+ key: 1,
53838
+ class: "bi bi-download"
53839
+ };
53840
+ _hoisted_60$3 = { class: "action-text" };
53841
+ _hoisted_61$3 = { class: "action-text" };
53842
+ _hoisted_62$3 = { class: "connection-tabs" };
53843
+ _hoisted_63$3 = { class: "nav nav-tabs" };
53844
+ _hoisted_64$3 = { class: "nav-item" };
53845
+ _hoisted_65$3 = { class: "badge bg-primary ms-1" };
53846
+ _hoisted_66$3 = { class: "nav-item" };
53847
+ _hoisted_67$3 = { class: "tab-content" };
53848
+ _hoisted_68$3 = { class: "tab-panel" };
53849
+ _hoisted_69$3 = { class: "databases-section" };
53850
+ _hoisted_70$3 = { class: "section-header" };
53851
+ _hoisted_71$3 = { class: "db-search" };
53852
+ _hoisted_72$2 = ["placeholder"];
53853
+ _hoisted_73$2 = ["disabled", "title"];
53854
+ _hoisted_74$2 = {
53591
53855
  key: 0,
53592
53856
  class: "spinner-border spinner-border-sm"
53593
53857
  };
53594
- _hoisted_65$3 = {
53858
+ _hoisted_75$2 = {
53595
53859
  key: 1,
53596
53860
  class: "bi bi-arrow-clockwise"
53597
53861
  };
53598
- _hoisted_66$3 = { class: "databases-list" };
53599
- _hoisted_67$3 = {
53862
+ _hoisted_76$2 = { class: "databases-list" };
53863
+ _hoisted_77$2 = {
53600
53864
  key: 0,
53601
53865
  class: "loading-state"
53602
53866
  };
53603
- _hoisted_68$3 = {
53867
+ _hoisted_78$2 = {
53604
53868
  key: 1,
53605
53869
  class: "empty-state"
53606
53870
  };
53607
- _hoisted_69$3 = {
53871
+ _hoisted_79$2 = {
53608
53872
  key: 2,
53609
53873
  class: "databases-list-simple"
53610
53874
  };
53611
- _hoisted_70$3 = ["onClick"];
53612
- _hoisted_71$3 = { class: "database-item-name" };
53613
- _hoisted_72$3 = { class: "database-item-actions" };
53614
- _hoisted_73$3 = { class: "tab-panel" };
53615
- _hoisted_74$2 = { class: "sql-section" };
53616
- _hoisted_75$2 = { class: "sql-header" };
53617
- _hoisted_76$2 = { class: "sql-title" };
53618
- _hoisted_77$2 = {
53875
+ _hoisted_80$2 = ["onClick"];
53876
+ _hoisted_81$2 = { class: "database-item-name" };
53877
+ _hoisted_82$2 = { class: "database-item-actions" };
53878
+ _hoisted_83$2 = { class: "tab-panel" };
53879
+ _hoisted_84$2 = { class: "sql-section" };
53880
+ _hoisted_85$2 = { class: "sql-header" };
53881
+ _hoisted_86$2 = { class: "sql-title" };
53882
+ _hoisted_87$2 = {
53619
53883
  key: 0,
53620
53884
  class: "sql-db-info"
53621
53885
  };
53622
- _hoisted_78$2 = { class: "badge bg-info" };
53623
- _hoisted_79$2 = {
53886
+ _hoisted_88$2 = { class: "badge bg-info" };
53887
+ _hoisted_89$2 = {
53624
53888
  key: 1,
53625
53889
  class: "modal fade show d-block",
53626
53890
  style: { "background": "rgba(0,0,0,0.5)" }
53627
53891
  };
53628
- _hoisted_80$2 = { class: "modal-dialog" };
53629
- _hoisted_81$2 = { class: "modal-content" };
53630
- _hoisted_82$2 = { class: "modal-header" };
53631
- _hoisted_83$2 = { class: "modal-title" };
53632
- _hoisted_84$2 = { class: "modal-body" };
53633
- _hoisted_85$2 = { class: "mb-3" };
53634
- _hoisted_86$2 = { class: "form-label" };
53635
- _hoisted_87$2 = ["placeholder"];
53636
- _hoisted_88$2 = { key: 0 };
53637
- _hoisted_89$2 = { class: "mb-3" };
53638
- _hoisted_90$2 = { class: "form-label" };
53639
- _hoisted_91$2 = { value: "" };
53640
- _hoisted_92$2 = { class: "mb-3" };
53641
- _hoisted_93$2 = { class: "form-label" };
53642
- _hoisted_94$2 = { value: "" };
53643
- _hoisted_95$2 = { key: 1 };
53644
- _hoisted_96$2 = { class: "mb-3" };
53645
- _hoisted_97$2 = { class: "form-label" };
53646
- _hoisted_98$2 = ["placeholder"];
53892
+ _hoisted_90$2 = { class: "modal-dialog" };
53893
+ _hoisted_91$2 = { class: "modal-content" };
53894
+ _hoisted_92$2 = { class: "modal-header" };
53895
+ _hoisted_93$2 = { class: "modal-title" };
53896
+ _hoisted_94$2 = { class: "modal-body" };
53897
+ _hoisted_95$2 = { class: "mb-3" };
53898
+ _hoisted_96$2 = { class: "form-label" };
53899
+ _hoisted_97$2 = ["placeholder"];
53900
+ _hoisted_98$2 = { key: 0 };
53647
53901
  _hoisted_99$2 = { class: "mb-3" };
53648
53902
  _hoisted_100$2 = { class: "form-label" };
53649
- _hoisted_101$2 = ["placeholder"];
53903
+ _hoisted_101$2 = { value: "" };
53650
53904
  _hoisted_102$2 = { class: "mb-3" };
53651
53905
  _hoisted_103$2 = { class: "form-label" };
53652
53906
  _hoisted_104$2 = { value: "" };
53653
- _hoisted_105$2 = { class: "mb-3" };
53654
- _hoisted_106$2 = { class: "form-label" };
53655
- _hoisted_107$2 = ["placeholder"];
53656
- _hoisted_108$2 = { key: 2 };
53907
+ _hoisted_105$2 = { key: 1 };
53908
+ _hoisted_106$2 = { class: "mb-3" };
53909
+ _hoisted_107$2 = { class: "form-label" };
53910
+ _hoisted_108$2 = ["placeholder"];
53657
53911
  _hoisted_109$1 = { class: "mb-3" };
53658
- _hoisted_110$1 = { class: "modal-footer" };
53659
- _hoisted_111$1 = ["disabled"];
53660
- _hoisted_112$1 = {
53912
+ _hoisted_110$1 = { class: "form-label" };
53913
+ _hoisted_111$1 = ["placeholder"];
53914
+ _hoisted_112$1 = { class: "mb-3" };
53915
+ _hoisted_113$1 = { class: "form-label" };
53916
+ _hoisted_114$1 = { value: "" };
53917
+ _hoisted_115$1 = { class: "mb-3" };
53918
+ _hoisted_116$1 = { class: "form-label" };
53919
+ _hoisted_117$1 = ["placeholder"];
53920
+ _hoisted_118$1 = { key: 2 };
53921
+ _hoisted_119$1 = { class: "mb-3" };
53922
+ _hoisted_120$1 = { class: "modal-footer" };
53923
+ _hoisted_121$1 = ["disabled"];
53924
+ _hoisted_122$1 = {
53661
53925
  key: 0,
53662
53926
  class: "spinner-border spinner-border-sm me-2"
53663
53927
  };
53928
+ _hoisted_123$1 = {
53929
+ key: 2,
53930
+ class: "modal fade show d-block",
53931
+ style: { "background": "rgba(0,0,0,0.5)" }
53932
+ };
53933
+ _hoisted_124$1 = { class: "modal-dialog modal-lg" };
53934
+ _hoisted_125$1 = { class: "modal-content" };
53935
+ _hoisted_126$1 = { class: "modal-header" };
53936
+ _hoisted_127$1 = { class: "modal-title" };
53937
+ _hoisted_128 = { class: "modal-body" };
53938
+ _hoisted_129 = {
53939
+ key: 0,
53940
+ class: "logs-state"
53941
+ };
53942
+ _hoisted_130 = {
53943
+ key: 1,
53944
+ class: "logs-state"
53945
+ };
53946
+ _hoisted_131 = {
53947
+ key: 2,
53948
+ class: "logs-table-wrap"
53949
+ };
53950
+ _hoisted_132 = { class: "table table-sm table-bordered mb-0" };
53951
+ _hoisted_133 = { class: "modal-footer" };
53664
53952
  connection_detail_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
53665
53953
  __name: "connection-detail",
53666
53954
  props: { connection: {} },
@@ -53680,6 +53968,7 @@ var init_connection_detail_vue_vue_type_script_setup_true_lang = __esmMin((() =>
53680
53968
  const props = __props;
53681
53969
  const emit = __emit;
53682
53970
  const connectionStore = useConnectionStore();
53971
+ const databaseService = new DatabaseService();
53683
53972
  const connectionStats = ref({
53684
53973
  databaseCount: 0,
53685
53974
  tableCount: 0,
@@ -53692,6 +53981,15 @@ var init_connection_detail_vue_vue_type_script_setup_true_lang = __esmMin((() =>
53692
53981
  function toggleDetails() {
53693
53982
  isDetailsExpanded.value = !isDetailsExpanded.value;
53694
53983
  }
53984
+ const exportingSchema = ref(false);
53985
+ const showLogs = ref(false);
53986
+ const loadingLogs = ref(false);
53987
+ const connectionLogs = ref([]);
53988
+ /** 日志列:由首条记录推导,兼容各方言返回的不同字段 */
53989
+ const logColumns = computed(() => {
53990
+ const first = connectionLogs.value.find((l) => l && typeof l === "object");
53991
+ return first ? Object.keys(first) : ["message"];
53992
+ });
53695
53993
  const showCreateDatabase = ref(false);
53696
53994
  const creatingDatabase = ref(false);
53697
53995
  const newDatabase = ref({
@@ -53777,11 +54075,71 @@ var init_connection_detail_vue_vue_type_script_setup_true_lang = __esmMin((() =>
53777
54075
  function editConnection() {
53778
54076
  if (props.connection) emit("edit-connection", props.connection);
53779
54077
  }
53780
- function exportSchema() {
53781
- if (props.connection) emit("export-schema", props.connection);
54078
+ /**
54079
+ * 导出架构:连接维度没有「当前库」,逐库调用后端 exportSchema 后拼成一份完整 DDL。
54080
+ * 后端已按方言实现(MySQL/PG/SQLite/MSSQL/Oracle/ClickHouse/CockroachDB/SAP/Mongo)。
54081
+ */
54082
+ async function exportSchema() {
54083
+ if (!props.connection || exportingSchema.value) return;
54084
+ const conn = props.connection;
54085
+ const connId = conn.id;
54086
+ if (!connId) return;
54087
+ if (!databases.value.length) await connectionStore.loadDatabases();
54088
+ const names = databases.value.map((d) => d.name).filter(Boolean);
54089
+ if (!names.length) {
54090
+ await modal.warning(t("connection.schemaExportNoDatabase"));
54091
+ return;
54092
+ }
54093
+ exportingSchema.value = true;
54094
+ try {
54095
+ const parts = [
54096
+ `-- ${conn.name} 架构导出`,
54097
+ `-- 时间: ${(/* @__PURE__ */ new Date()).toISOString()}`,
54098
+ `-- 数据库数: ${names.length}`,
54099
+ ""
54100
+ ];
54101
+ for (const db of names) {
54102
+ const res = await databaseService.exportSchema(connId, db);
54103
+ const schema = String(res?.schema || "").trim();
54104
+ parts.push(`-- ==================== ${db} ====================`);
54105
+ parts.push(schema || `-- (${db} 无表或导出为空)`);
54106
+ parts.push("");
54107
+ }
54108
+ const stamp = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-").slice(0, 19);
54109
+ const result = await saveTextFile(`${conn.name}-schema-${stamp}.sql`, parts.join("\n"), { SQL: ["sql"] });
54110
+ if (result.cancelled) return;
54111
+ await modal.success(t("connection.schemaExported", {
54112
+ count: names.length,
54113
+ path: result.path ? `\n${result.path}` : ""
54114
+ }));
54115
+ } catch (error) {
54116
+ await modal.error(error?.message || t("connection.schemaExportFailed"));
54117
+ } finally {
54118
+ exportingSchema.value = false;
54119
+ }
54120
+ }
54121
+ /** 查看日志:拉取最近记录后在本组件的弹窗里展示 */
54122
+ async function viewLogs() {
54123
+ const connId = props.connection?.id;
54124
+ if (!connId) return;
54125
+ showLogs.value = true;
54126
+ loadingLogs.value = true;
54127
+ connectionLogs.value = [];
54128
+ try {
54129
+ const res = await databaseService.viewLogs(connId, void 0, 100);
54130
+ connectionLogs.value = Array.isArray(res?.logs) ? res.logs : [];
54131
+ } catch (error) {
54132
+ await modal.error(error?.message || t("connection.logsLoadFailed"));
54133
+ } finally {
54134
+ loadingLogs.value = false;
54135
+ }
53782
54136
  }
53783
- function viewLogs() {
53784
- if (props.connection) emit("view-logs", props.connection);
54137
+ /** 日志单元格:对象/数组序列化,避免表格里出现 [object Object] */
54138
+ function formatLogCell(row, key) {
54139
+ const v = row?.[key];
54140
+ if (v === null || v === void 0) return "";
54141
+ if (typeof v === "object") return JSON.stringify(v);
54142
+ return String(v);
53785
54143
  }
53786
54144
  function showCreateDatabaseModal() {
53787
54145
  emit("create-database");
@@ -53837,7 +54195,8 @@ var init_connection_detail_vue_vue_type_script_setup_true_lang = __esmMin((() =>
53837
54195
  postgres: "PostgreSQL",
53838
54196
  mssql: "SQL Server",
53839
54197
  sqlite: "SQLite",
53840
- oracle: "Oracle"
54198
+ oracle: "Oracle",
54199
+ remote: "远程代理服务"
53841
54200
  }[type || ""] || "Unknown";
53842
54201
  }
53843
54202
  function getDbLogoClass(type) {
@@ -53849,12 +54208,13 @@ var init_connection_detail_vue_vue_type_script_setup_true_lang = __esmMin((() =>
53849
54208
  postgres: "PG",
53850
54209
  mssql: "MS",
53851
54210
  sqlite: "SQ",
53852
- oracle: "OR"
54211
+ oracle: "OR",
54212
+ remote: "R"
53853
54213
  }[type || ""] || "DB";
53854
54214
  }
53855
54215
  return (_ctx, _cache) => {
53856
54216
  return openBlock(), createElementBlock("div", _hoisted_1$7, [
53857
- createBaseVNode("div", _hoisted_2$7, [createBaseVNode("div", _hoisted_3$7, [createBaseVNode("div", _hoisted_4$7, [createBaseVNode("div", { class: normalizeClass(["db-logo", getDbLogoClass(__props.connection?.type)]) }, toDisplayString(getDbLogoText(__props.connection?.type)), 3)]), createBaseVNode("div", _hoisted_5$7, [createBaseVNode("h4", _hoisted_6$7, toDisplayString(__props.connection?.name), 1), createBaseVNode("div", _hoisted_7$7, [createBaseVNode("span", _hoisted_8$7, toDisplayString(getDbTypeLabel(__props.connection?.type)), 1), createBaseVNode("span", { class: normalizeClass(["connection-status", connectionStatusClass.value]) }, [_cache[14] || (_cache[14] = createBaseVNode("div", { class: "status-dot" }, null, -1)), createTextVNode(" " + toDisplayString(connectionStatusText.value), 1)], 2)])])]), createBaseVNode("div", _hoisted_9$7, [
54217
+ createBaseVNode("div", _hoisted_2$7, [createBaseVNode("div", _hoisted_3$7, [createBaseVNode("div", _hoisted_4$7, [createBaseVNode("div", { class: normalizeClass(["db-logo", getDbLogoClass(__props.connection?.type)]) }, toDisplayString(getDbLogoText(__props.connection?.type)), 3)]), createBaseVNode("div", _hoisted_5$7, [createBaseVNode("h4", _hoisted_6$7, toDisplayString(__props.connection?.name), 1), createBaseVNode("div", _hoisted_7$7, [createBaseVNode("span", _hoisted_8$7, toDisplayString(getDbTypeLabel(__props.connection?.type)), 1), createBaseVNode("span", { class: normalizeClass(["connection-status", connectionStatusClass.value]) }, [_cache[16] || (_cache[16] = createBaseVNode("div", { class: "status-dot" }, null, -1)), createTextVNode(" " + toDisplayString(connectionStatusText.value), 1)], 2)])])]), createBaseVNode("div", _hoisted_9$7, [
53858
54218
  createBaseVNode("button", {
53859
54219
  class: "btn btn-sm btn-outline-info",
53860
54220
  onClick: toggleDetails,
@@ -53863,148 +54223,151 @@ var init_connection_detail_vue_vue_type_script_setup_true_lang = __esmMin((() =>
53863
54223
  createBaseVNode("button", {
53864
54224
  class: "btn btn-sm btn-outline-primary",
53865
54225
  onClick: testConnection
53866
- }, [..._cache[15] || (_cache[15] = [createBaseVNode("i", { class: "bi bi-wifi" }, null, -1)])]),
54226
+ }, [..._cache[17] || (_cache[17] = [createBaseVNode("i", { class: "bi bi-wifi" }, null, -1)])]),
53867
54227
  createBaseVNode("button", {
53868
54228
  class: "btn btn-sm btn-outline-secondary",
53869
54229
  onClick: editConnection
53870
- }, [_cache[16] || (_cache[16] = createBaseVNode("i", { class: "bi bi-pencil" }, null, -1)), createTextVNode(" " + toDisplayString(_ctx.$t("common.edit")), 1)])
54230
+ }, [_cache[18] || (_cache[18] = createBaseVNode("i", { class: "bi bi-pencil" }, null, -1)), createTextVNode(" " + toDisplayString(_ctx.$t("common.edit")), 1)])
53871
54231
  ])]),
53872
- isDetailsExpanded.value ? (openBlock(), createElementBlock("div", _hoisted_11$7, [createBaseVNode("div", _hoisted_12$7, [createBaseVNode("div", _hoisted_13$7, [createBaseVNode("div", _hoisted_14$7, [createBaseVNode("div", _hoisted_15$7, [createBaseVNode("h6", _hoisted_16$7, [_cache[17] || (_cache[17] = createBaseVNode("i", { class: "bi bi-info-circle" }, null, -1)), createTextVNode(" " + toDisplayString(_ctx.$t("connection.basicInfo")), 1)]), createBaseVNode("div", _hoisted_17$7, [
54232
+ isDetailsExpanded.value ? (openBlock(), createElementBlock("div", _hoisted_11$7, [createBaseVNode("div", _hoisted_12$7, [createBaseVNode("div", _hoisted_13$7, [createBaseVNode("div", _hoisted_14$7, [createBaseVNode("div", _hoisted_15$7, [createBaseVNode("h6", _hoisted_16$7, [_cache[19] || (_cache[19] = createBaseVNode("i", { class: "bi bi-info-circle" }, null, -1)), createTextVNode(" " + toDisplayString(_ctx.$t("connection.basicInfo")), 1)]), createBaseVNode("div", _hoisted_17$7, [
53873
54233
  createBaseVNode("div", _hoisted_18$7, [createBaseVNode("label", _hoisted_19$7, toDisplayString(_ctx.$t("connection.host")), 1), createBaseVNode("div", _hoisted_20$7, toDisplayString(__props.connection?.host), 1)]),
53874
- createBaseVNode("div", _hoisted_21$7, [createBaseVNode("label", _hoisted_22$7, toDisplayString(_ctx.$t("connection.port")), 1), createBaseVNode("div", _hoisted_23$7, toDisplayString(__props.connection?.port), 1)]),
53875
- createBaseVNode("div", _hoisted_24$7, [createBaseVNode("label", _hoisted_25$7, toDisplayString(_ctx.$t("connection.username")), 1), createBaseVNode("div", _hoisted_26$6, toDisplayString(__props.connection?.username), 1)]),
53876
- createBaseVNode("div", _hoisted_27$6, [createBaseVNode("label", _hoisted_28$6, toDisplayString(_ctx.$t("connection.databaseType")), 1), createBaseVNode("div", _hoisted_29$6, [createBaseVNode("span", { class: normalizeClass(["db-type-badge", getDbLogoClass(__props.connection?.type)]) }, toDisplayString(getDbTypeLabel(__props.connection?.type)), 3)])])
53877
- ])]), createBaseVNode("div", _hoisted_30$5, [createBaseVNode("h6", _hoisted_31$5, [_cache[18] || (_cache[18] = createBaseVNode("i", { class: "bi bi-bar-chart" }, null, -1)), createTextVNode(" " + toDisplayString(_ctx.$t("connection.connectionStats")), 1)]), createBaseVNode("div", _hoisted_32$5, [
53878
- createBaseVNode("div", _hoisted_33$5, [createBaseVNode("div", _hoisted_34$5, toDisplayString(connectionStats.value.databaseCount || 0), 1), createBaseVNode("div", _hoisted_35$5, toDisplayString(_ctx.$t("connection.databaseCount")), 1)]),
53879
- createBaseVNode("div", _hoisted_36$5, [createBaseVNode("div", _hoisted_37$5, toDisplayString(connectionStats.value.tableCount || 0), 1), createBaseVNode("div", _hoisted_38$5, toDisplayString(_ctx.$t("connection.tableCount")), 1)]),
53880
- createBaseVNode("div", _hoisted_39$5, [createBaseVNode("div", _hoisted_40$5, toDisplayString(formatFileSize(connectionStats.value.totalSize || 0)), 1), createBaseVNode("div", _hoisted_41$5, toDisplayString(_ctx.$t("connection.totalSize")), 1)]),
53881
- createBaseVNode("div", _hoisted_42$5, [createBaseVNode("div", _hoisted_43$5, toDisplayString(connectionStats.value.lastConnected || _ctx.$t("common.never")), 1), createBaseVNode("div", _hoisted_44$5, toDisplayString(_ctx.$t("connection.lastConnected")), 1)])
54234
+ __props.connection?._isProxy && __props.connection?.options?.remoteUrl ? (openBlock(), createElementBlock("div", _hoisted_21$7, [createBaseVNode("label", _hoisted_22$7, toDisplayString(_ctx.$t("connection.remoteUrl")), 1), createBaseVNode("div", _hoisted_23$7, toDisplayString(__props.connection?.options?.remoteUrl), 1)])) : createCommentVNode("", true),
54235
+ __props.connection?._remoteError ? (openBlock(), createElementBlock("div", _hoisted_24$7, [createBaseVNode("label", _hoisted_25$7, toDisplayString(_ctx.$t("connection.connectionStatus")), 1), createBaseVNode("div", _hoisted_26$6, toDisplayString(__props.connection?._remoteError), 1)])) : createCommentVNode("", true),
54236
+ createBaseVNode("div", _hoisted_27$6, [createBaseVNode("label", _hoisted_28$6, toDisplayString(_ctx.$t("connection.port")), 1), createBaseVNode("div", _hoisted_29$6, toDisplayString(__props.connection?.port), 1)]),
54237
+ createBaseVNode("div", _hoisted_30$5, [createBaseVNode("label", _hoisted_31$5, toDisplayString(_ctx.$t("connection.username")), 1), createBaseVNode("div", _hoisted_32$5, toDisplayString(__props.connection?.username), 1)]),
54238
+ createBaseVNode("div", _hoisted_33$5, [createBaseVNode("label", _hoisted_34$5, toDisplayString(_ctx.$t("connection.databaseType")), 1), createBaseVNode("div", _hoisted_35$5, [createBaseVNode("span", { class: normalizeClass(["db-type-badge", getDbLogoClass(__props.connection?.type)]) }, toDisplayString(getDbTypeLabel(__props.connection?.type)), 3)])])
54239
+ ])]), createBaseVNode("div", _hoisted_36$5, [createBaseVNode("h6", _hoisted_37$5, [_cache[20] || (_cache[20] = createBaseVNode("i", { class: "bi bi-bar-chart" }, null, -1)), createTextVNode(" " + toDisplayString(_ctx.$t("connection.connectionStats")), 1)]), createBaseVNode("div", _hoisted_38$5, [
54240
+ createBaseVNode("div", _hoisted_39$5, [createBaseVNode("div", _hoisted_40$5, toDisplayString(connectionStats.value.databaseCount || 0), 1), createBaseVNode("div", _hoisted_41$5, toDisplayString(_ctx.$t("connection.databaseCount")), 1)]),
54241
+ createBaseVNode("div", _hoisted_42$5, [createBaseVNode("div", _hoisted_43$5, toDisplayString(connectionStats.value.tableCount || 0), 1), createBaseVNode("div", _hoisted_44$5, toDisplayString(_ctx.$t("connection.tableCount")), 1)]),
54242
+ createBaseVNode("div", _hoisted_45$5, [createBaseVNode("div", _hoisted_46$5, toDisplayString(formatFileSize(connectionStats.value.totalSize || 0)), 1), createBaseVNode("div", _hoisted_47$4, toDisplayString(_ctx.$t("connection.totalSize")), 1)]),
54243
+ createBaseVNode("div", _hoisted_48$4, [createBaseVNode("div", _hoisted_49$4, toDisplayString(connectionStats.value.lastConnected || _ctx.$t("common.never")), 1), createBaseVNode("div", _hoisted_50$4, toDisplayString(_ctx.$t("connection.lastConnected")), 1)])
53882
54244
  ])])])])])])) : createCommentVNode("", true),
53883
- createBaseVNode("div", _hoisted_45$5, [createBaseVNode("div", _hoisted_46$5, [createBaseVNode("h6", _hoisted_47$5, [_cache[19] || (_cache[19] = createBaseVNode("i", { class: "bi bi-lightning" }, null, -1)), createTextVNode(" " + toDisplayString(_ctx.$t("connection.quickActions")), 1)])]), createBaseVNode("div", _hoisted_48$4, [
54245
+ createBaseVNode("div", _hoisted_51$4, [createBaseVNode("div", _hoisted_52$4, [createBaseVNode("h6", _hoisted_53$4, [_cache[21] || (_cache[21] = createBaseVNode("i", { class: "bi bi-lightning" }, null, -1)), createTextVNode(" " + toDisplayString(_ctx.$t("connection.quickActions")), 1)])]), createBaseVNode("div", _hoisted_54$4, [
53884
54246
  createBaseVNode("button", {
53885
54247
  class: "action-btn",
53886
54248
  onClick: showCreateDatabaseModal
53887
- }, [_cache[20] || (_cache[20] = createBaseVNode("div", { class: "action-icon" }, [createBaseVNode("i", { class: "bi bi-plus-circle" })], -1)), createBaseVNode("div", _hoisted_49$4, toDisplayString(_ctx.$t("connection.createDatabase")), 1)]),
54249
+ }, [_cache[22] || (_cache[22] = createBaseVNode("div", { class: "action-icon" }, [createBaseVNode("i", { class: "bi bi-plus-circle" })], -1)), createBaseVNode("div", _hoisted_55$4, toDisplayString(_ctx.$t("connection.createDatabase")), 1)]),
53888
54250
  createBaseVNode("button", {
53889
54251
  class: "action-btn",
54252
+ disabled: exportingSchema.value,
53890
54253
  onClick: exportSchema
53891
- }, [_cache[21] || (_cache[21] = createBaseVNode("div", { class: "action-icon" }, [createBaseVNode("i", { class: "bi bi-download" })], -1)), createBaseVNode("div", _hoisted_50$4, toDisplayString(_ctx.$t("connection.exportSchema")), 1)]),
54254
+ }, [createBaseVNode("div", _hoisted_57$3, [exportingSchema.value ? (openBlock(), createElementBlock("i", _hoisted_58$3)) : (openBlock(), createElementBlock("i", _hoisted_59$3))]), createBaseVNode("div", _hoisted_60$3, toDisplayString(_ctx.$t("connection.exportSchema")), 1)], 8, _hoisted_56$4),
53892
54255
  createBaseVNode("button", {
53893
54256
  class: "action-btn",
53894
54257
  onClick: viewLogs
53895
- }, [_cache[22] || (_cache[22] = createBaseVNode("div", { class: "action-icon" }, [createBaseVNode("i", { class: "bi bi-file-text" })], -1)), createBaseVNode("div", _hoisted_51$4, toDisplayString(_ctx.$t("connection.viewLogs")), 1)])
54258
+ }, [_cache[23] || (_cache[23] = createBaseVNode("div", { class: "action-icon" }, [createBaseVNode("i", { class: "bi bi-file-text" })], -1)), createBaseVNode("div", _hoisted_61$3, toDisplayString(_ctx.$t("connection.viewLogs")), 1)])
53896
54259
  ])]),
53897
- createBaseVNode("div", _hoisted_52$4, [createBaseVNode("ul", _hoisted_53$4, [createBaseVNode("li", _hoisted_54$3, [createBaseVNode("button", {
54260
+ createBaseVNode("div", _hoisted_62$3, [createBaseVNode("ul", _hoisted_63$3, [createBaseVNode("li", _hoisted_64$3, [createBaseVNode("button", {
53898
54261
  class: normalizeClass(["nav-link", { active: activeTab.value === "databases" }]),
53899
54262
  onClick: _cache[0] || (_cache[0] = ($event) => activeTab.value = "databases")
53900
54263
  }, [
53901
- _cache[23] || (_cache[23] = createBaseVNode("i", { class: "bi bi-database-fill" }, null, -1)),
54264
+ _cache[24] || (_cache[24] = createBaseVNode("i", { class: "bi bi-database-fill" }, null, -1)),
53902
54265
  createTextVNode(" " + toDisplayString(_ctx.$t("connection.databaseList")) + " ", 1),
53903
- createBaseVNode("span", _hoisted_55$3, toDisplayString(databases.value.length), 1)
53904
- ], 2)]), createBaseVNode("li", _hoisted_56$3, [createBaseVNode("button", {
54266
+ createBaseVNode("span", _hoisted_65$3, toDisplayString(databases.value.length), 1)
54267
+ ], 2)]), createBaseVNode("li", _hoisted_66$3, [createBaseVNode("button", {
53905
54268
  class: normalizeClass(["nav-link", { active: activeTab.value === "sql" }]),
53906
54269
  onClick: _cache[1] || (_cache[1] = ($event) => activeTab.value = "sql")
53907
- }, [_cache[24] || (_cache[24] = createBaseVNode("i", { class: "bi bi-terminal" }, null, -1)), createTextVNode(" " + toDisplayString(_ctx.$t("nav.sqlQuery")), 1)], 2)])]), createBaseVNode("div", _hoisted_57$3, [withDirectives(createBaseVNode("div", _hoisted_58$3, [createBaseVNode("div", _hoisted_59$3, [createBaseVNode("div", _hoisted_60$3, [createBaseVNode("div", _hoisted_61$3, [_cache[25] || (_cache[25] = createBaseVNode("i", { class: "bi bi-search" }, null, -1)), withDirectives(createBaseVNode("input", {
54270
+ }, [_cache[25] || (_cache[25] = createBaseVNode("i", { class: "bi bi-terminal" }, null, -1)), createTextVNode(" " + toDisplayString(_ctx.$t("nav.sqlQuery")), 1)], 2)])]), createBaseVNode("div", _hoisted_67$3, [withDirectives(createBaseVNode("div", _hoisted_68$3, [createBaseVNode("div", _hoisted_69$3, [createBaseVNode("div", _hoisted_70$3, [createBaseVNode("div", _hoisted_71$3, [_cache[26] || (_cache[26] = createBaseVNode("i", { class: "bi bi-search" }, null, -1)), withDirectives(createBaseVNode("input", {
53908
54271
  type: "text",
53909
54272
  class: "db-search-input",
53910
54273
  "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => searchKeyword.value = $event),
53911
54274
  placeholder: _ctx.$t("connection.searchDatabase")
53912
- }, null, 8, _hoisted_62$3), [[vModelText, searchKeyword.value]])]), createBaseVNode("button", {
54275
+ }, null, 8, _hoisted_72$2), [[vModelText, searchKeyword.value]])]), createBaseVNode("button", {
53913
54276
  class: "db-refresh-btn",
53914
54277
  onClick: loadDatabases,
53915
54278
  disabled: loadingDatabases.value,
53916
54279
  title: _ctx.$t("common.refresh")
53917
- }, [loadingDatabases.value ? (openBlock(), createElementBlock("span", _hoisted_64$3)) : (openBlock(), createElementBlock("i", _hoisted_65$3))], 8, _hoisted_63$3)]), createBaseVNode("div", _hoisted_66$3, [loadingDatabases.value ? (openBlock(), createElementBlock("div", _hoisted_67$3, [_cache[26] || (_cache[26] = createBaseVNode("div", { class: "spinner-border text-primary" }, null, -1)), createBaseVNode("span", null, toDisplayString(_ctx.$t("connection.loadingDatabases")), 1)])) : filteredDatabases.value.length === 0 ? (openBlock(), createElementBlock("div", _hoisted_68$3, [
53918
- _cache[28] || (_cache[28] = createBaseVNode("i", { class: "bi bi-database" }, null, -1)),
54280
+ }, [loadingDatabases.value ? (openBlock(), createElementBlock("span", _hoisted_74$2)) : (openBlock(), createElementBlock("i", _hoisted_75$2))], 8, _hoisted_73$2)]), createBaseVNode("div", _hoisted_76$2, [loadingDatabases.value ? (openBlock(), createElementBlock("div", _hoisted_77$2, [_cache[27] || (_cache[27] = createBaseVNode("div", { class: "spinner-border text-primary" }, null, -1)), createBaseVNode("span", null, toDisplayString(_ctx.$t("connection.loadingDatabases")), 1)])) : filteredDatabases.value.length === 0 ? (openBlock(), createElementBlock("div", _hoisted_78$2, [
54281
+ _cache[29] || (_cache[29] = createBaseVNode("i", { class: "bi bi-database" }, null, -1)),
53919
54282
  createBaseVNode("p", null, toDisplayString(searchKeyword.value ? _ctx.$t("connection.noMatchDatabase") : _ctx.$t("connection.noDatabase")), 1),
53920
54283
  createBaseVNode("button", {
53921
54284
  class: "btn btn-sm btn-primary",
53922
54285
  onClick: showCreateDatabaseModal
53923
- }, [_cache[27] || (_cache[27] = createBaseVNode("i", { class: "bi bi-plus" }, null, -1)), createTextVNode(" " + toDisplayString(_ctx.$t("connection.createDatabase")), 1)])
53924
- ])) : (openBlock(), createElementBlock("div", _hoisted_69$3, [(openBlock(true), createElementBlock(Fragment, null, renderList(filteredDatabases.value, (database) => {
54286
+ }, [_cache[28] || (_cache[28] = createBaseVNode("i", { class: "bi bi-plus" }, null, -1)), createTextVNode(" " + toDisplayString(_ctx.$t("connection.createDatabase")), 1)])
54287
+ ])) : (openBlock(), createElementBlock("div", _hoisted_79$2, [(openBlock(true), createElementBlock(Fragment, null, renderList(filteredDatabases.value, (database) => {
53925
54288
  return openBlock(), createElementBlock("div", {
53926
54289
  key: database.name,
53927
54290
  class: "database-item",
53928
54291
  onClick: ($event) => openDatabase(database)
53929
54292
  }, [
53930
- _cache[30] || (_cache[30] = createBaseVNode("div", { class: "database-item-icon" }, [createBaseVNode("i", { class: "bi bi-database" })], -1)),
53931
- createBaseVNode("div", _hoisted_71$3, toDisplayString(database.name), 1),
53932
- createBaseVNode("div", _hoisted_72$3, [createBaseVNode("button", {
54293
+ _cache[31] || (_cache[31] = createBaseVNode("div", { class: "database-item-icon" }, [createBaseVNode("i", { class: "bi bi-database" })], -1)),
54294
+ createBaseVNode("div", _hoisted_81$2, toDisplayString(database.name), 1),
54295
+ createBaseVNode("div", _hoisted_82$2, [createBaseVNode("button", {
53933
54296
  class: "btn btn-sm btn-outline-secondary",
53934
54297
  onClick: _cache[3] || (_cache[3] = withModifiers(($event) => activeTab.value = "sql", ["stop"]))
53935
- }, [..._cache[29] || (_cache[29] = [createBaseVNode("i", { class: "bi bi-terminal" }, null, -1)])])])
53936
- ], 8, _hoisted_70$3);
53937
- }), 128))]))])])], 512), [[vShow, activeTab.value === "databases"]]), withDirectives(createBaseVNode("div", _hoisted_73$3, [createBaseVNode("div", _hoisted_74$2, [createBaseVNode("div", _hoisted_75$2, [createBaseVNode("h6", _hoisted_76$2, [_cache[31] || (_cache[31] = createBaseVNode("i", { class: "bi bi-terminal" }, null, -1)), createTextVNode(" " + toDisplayString(_ctx.$t("nav.sqlQuery")), 1)]), props.connection ? (openBlock(), createElementBlock("div", _hoisted_77$2, [createBaseVNode("span", _hoisted_78$2, toDisplayString(props.connection.name), 1)])) : createCommentVNode("", true)]), createVNode(sql_executor_default, {
54298
+ }, [..._cache[30] || (_cache[30] = [createBaseVNode("i", { class: "bi bi-terminal" }, null, -1)])])])
54299
+ ], 8, _hoisted_80$2);
54300
+ }), 128))]))])])], 512), [[vShow, activeTab.value === "databases"]]), withDirectives(createBaseVNode("div", _hoisted_83$2, [createBaseVNode("div", _hoisted_84$2, [createBaseVNode("div", _hoisted_85$2, [createBaseVNode("h6", _hoisted_86$2, [_cache[32] || (_cache[32] = createBaseVNode("i", { class: "bi bi-terminal" }, null, -1)), createTextVNode(" " + toDisplayString(_ctx.$t("nav.sqlQuery")), 1)]), props.connection ? (openBlock(), createElementBlock("div", _hoisted_87$2, [createBaseVNode("span", _hoisted_88$2, toDisplayString(props.connection.name), 1)])) : createCommentVNode("", true)]), createVNode(sql_executor_default, {
53938
54301
  connection: props.connection,
53939
54302
  database: ""
53940
54303
  }, null, 8, ["connection"])])], 512), [[vShow, activeTab.value === "sql"]])])]),
53941
- showCreateDatabase.value ? (openBlock(), createElementBlock("div", _hoisted_79$2, [createBaseVNode("div", _hoisted_80$2, [createBaseVNode("div", _hoisted_81$2, [
53942
- createBaseVNode("div", _hoisted_82$2, [createBaseVNode("h5", _hoisted_83$2, toDisplayString(_ctx.$t("connection.createDatabaseTitle")), 1), createBaseVNode("button", {
54304
+ showCreateDatabase.value ? (openBlock(), createElementBlock("div", _hoisted_89$2, [createBaseVNode("div", _hoisted_90$2, [createBaseVNode("div", _hoisted_91$2, [
54305
+ createBaseVNode("div", _hoisted_92$2, [createBaseVNode("h5", _hoisted_93$2, toDisplayString(_ctx.$t("connection.createDatabaseTitle")), 1), createBaseVNode("button", {
53943
54306
  type: "button",
53944
54307
  class: "btn-close",
53945
54308
  onClick: _cache[4] || (_cache[4] = ($event) => showCreateDatabase.value = false)
53946
54309
  })]),
53947
- createBaseVNode("div", _hoisted_84$2, [createBaseVNode("form", null, [
53948
- createBaseVNode("div", _hoisted_85$2, [createBaseVNode("label", _hoisted_86$2, [createTextVNode(toDisplayString(_ctx.$t("connection.databaseNameLabel")) + " ", 1), _cache[32] || (_cache[32] = createBaseVNode("span", { class: "text-danger" }, "*", -1))]), withDirectives(createBaseVNode("input", {
54310
+ createBaseVNode("div", _hoisted_94$2, [createBaseVNode("form", null, [
54311
+ createBaseVNode("div", _hoisted_95$2, [createBaseVNode("label", _hoisted_96$2, [createTextVNode(toDisplayString(_ctx.$t("connection.databaseNameLabel")) + " ", 1), _cache[33] || (_cache[33] = createBaseVNode("span", { class: "text-danger" }, "*", -1))]), withDirectives(createBaseVNode("input", {
53949
54312
  type: "text",
53950
54313
  class: "form-control",
53951
54314
  "onUpdate:modelValue": _cache[5] || (_cache[5] = ($event) => newDatabase.value.name = $event),
53952
54315
  placeholder: _ctx.$t("connection.enterDatabaseName"),
53953
54316
  required: ""
53954
- }, null, 8, _hoisted_87$2), [[vModelText, newDatabase.value.name]])]),
53955
- __props.connection?.type === "mysql" ? (openBlock(), createElementBlock("div", _hoisted_88$2, [createBaseVNode("div", _hoisted_89$2, [createBaseVNode("label", _hoisted_90$2, toDisplayString(_ctx.$t("connection.charset")), 1), withDirectives(createBaseVNode("select", {
54317
+ }, null, 8, _hoisted_97$2), [[vModelText, newDatabase.value.name]])]),
54318
+ __props.connection?.type === "mysql" ? (openBlock(), createElementBlock("div", _hoisted_98$2, [createBaseVNode("div", _hoisted_99$2, [createBaseVNode("label", _hoisted_100$2, toDisplayString(_ctx.$t("connection.charset")), 1), withDirectives(createBaseVNode("select", {
53956
54319
  class: "form-select",
53957
54320
  "onUpdate:modelValue": _cache[6] || (_cache[6] = ($event) => newDatabase.value.options.charset = $event)
53958
54321
  }, [
53959
- createBaseVNode("option", _hoisted_91$2, toDisplayString(_ctx.$t("common.default")), 1),
53960
- _cache[33] || (_cache[33] = createBaseVNode("option", { value: "utf8mb4" }, "utf8mb4", -1)),
53961
- _cache[34] || (_cache[34] = createBaseVNode("option", { value: "utf8" }, "utf8", -1)),
53962
- _cache[35] || (_cache[35] = createBaseVNode("option", { value: "latin1" }, "latin1", -1))
53963
- ], 512), [[vModelSelect, newDatabase.value.options.charset]])]), createBaseVNode("div", _hoisted_92$2, [createBaseVNode("label", _hoisted_93$2, toDisplayString(_ctx.$t("connection.collation")), 1), withDirectives(createBaseVNode("select", {
54322
+ createBaseVNode("option", _hoisted_101$2, toDisplayString(_ctx.$t("common.default")), 1),
54323
+ _cache[34] || (_cache[34] = createBaseVNode("option", { value: "utf8mb4" }, "utf8mb4", -1)),
54324
+ _cache[35] || (_cache[35] = createBaseVNode("option", { value: "utf8" }, "utf8", -1)),
54325
+ _cache[36] || (_cache[36] = createBaseVNode("option", { value: "latin1" }, "latin1", -1))
54326
+ ], 512), [[vModelSelect, newDatabase.value.options.charset]])]), createBaseVNode("div", _hoisted_102$2, [createBaseVNode("label", _hoisted_103$2, toDisplayString(_ctx.$t("connection.collation")), 1), withDirectives(createBaseVNode("select", {
53964
54327
  class: "form-select",
53965
54328
  "onUpdate:modelValue": _cache[7] || (_cache[7] = ($event) => newDatabase.value.options.collation = $event)
53966
54329
  }, [
53967
- createBaseVNode("option", _hoisted_94$2, toDisplayString(_ctx.$t("common.default")), 1),
53968
- _cache[36] || (_cache[36] = createBaseVNode("option", { value: "utf8mb4_unicode_ci" }, "utf8mb4_unicode_ci", -1)),
53969
- _cache[37] || (_cache[37] = createBaseVNode("option", { value: "utf8mb4_general_ci" }, "utf8mb4_general_ci", -1)),
53970
- _cache[38] || (_cache[38] = createBaseVNode("option", { value: "utf8_unicode_ci" }, "utf8_unicode_ci", -1))
54330
+ createBaseVNode("option", _hoisted_104$2, toDisplayString(_ctx.$t("common.default")), 1),
54331
+ _cache[37] || (_cache[37] = createBaseVNode("option", { value: "utf8mb4_unicode_ci" }, "utf8mb4_unicode_ci", -1)),
54332
+ _cache[38] || (_cache[38] = createBaseVNode("option", { value: "utf8mb4_general_ci" }, "utf8mb4_general_ci", -1)),
54333
+ _cache[39] || (_cache[39] = createBaseVNode("option", { value: "utf8_unicode_ci" }, "utf8_unicode_ci", -1))
53971
54334
  ], 512), [[vModelSelect, newDatabase.value.options.collation]])])])) : createCommentVNode("", true),
53972
- __props.connection?.type === "postgres" ? (openBlock(), createElementBlock("div", _hoisted_95$2, [
53973
- createBaseVNode("div", _hoisted_96$2, [createBaseVNode("label", _hoisted_97$2, toDisplayString(_ctx.$t("connection.owner")), 1), withDirectives(createBaseVNode("input", {
54335
+ __props.connection?.type === "postgres" ? (openBlock(), createElementBlock("div", _hoisted_105$2, [
54336
+ createBaseVNode("div", _hoisted_106$2, [createBaseVNode("label", _hoisted_107$2, toDisplayString(_ctx.$t("connection.owner")), 1), withDirectives(createBaseVNode("input", {
53974
54337
  type: "text",
53975
54338
  class: "form-control",
53976
54339
  "onUpdate:modelValue": _cache[8] || (_cache[8] = ($event) => newDatabase.value.options.owner = $event),
53977
54340
  placeholder: _ctx.$t("connection.databaseOwner")
53978
- }, null, 8, _hoisted_98$2), [[vModelText, newDatabase.value.options.owner]])]),
53979
- createBaseVNode("div", _hoisted_99$2, [createBaseVNode("label", _hoisted_100$2, toDisplayString(_ctx.$t("connection.template")), 1), withDirectives(createBaseVNode("input", {
54341
+ }, null, 8, _hoisted_108$2), [[vModelText, newDatabase.value.options.owner]])]),
54342
+ createBaseVNode("div", _hoisted_109$1, [createBaseVNode("label", _hoisted_110$1, toDisplayString(_ctx.$t("connection.template")), 1), withDirectives(createBaseVNode("input", {
53980
54343
  type: "text",
53981
54344
  class: "form-control",
53982
54345
  "onUpdate:modelValue": _cache[9] || (_cache[9] = ($event) => newDatabase.value.options.template = $event),
53983
54346
  placeholder: _ctx.$t("connection.templateDatabase")
53984
- }, null, 8, _hoisted_101$2), [[vModelText, newDatabase.value.options.template]])]),
53985
- createBaseVNode("div", _hoisted_102$2, [createBaseVNode("label", _hoisted_103$2, toDisplayString(_ctx.$t("connection.encoding")), 1), withDirectives(createBaseVNode("select", {
54347
+ }, null, 8, _hoisted_111$1), [[vModelText, newDatabase.value.options.template]])]),
54348
+ createBaseVNode("div", _hoisted_112$1, [createBaseVNode("label", _hoisted_113$1, toDisplayString(_ctx.$t("connection.encoding")), 1), withDirectives(createBaseVNode("select", {
53986
54349
  class: "form-select",
53987
54350
  "onUpdate:modelValue": _cache[10] || (_cache[10] = ($event) => newDatabase.value.options.encoding = $event)
53988
54351
  }, [
53989
- createBaseVNode("option", _hoisted_104$2, toDisplayString(_ctx.$t("common.default")), 1),
53990
- _cache[39] || (_cache[39] = createBaseVNode("option", { value: "UTF8" }, "UTF8", -1)),
53991
- _cache[40] || (_cache[40] = createBaseVNode("option", { value: "LATIN1" }, "LATIN1", -1))
54352
+ createBaseVNode("option", _hoisted_114$1, toDisplayString(_ctx.$t("common.default")), 1),
54353
+ _cache[40] || (_cache[40] = createBaseVNode("option", { value: "UTF8" }, "UTF8", -1)),
54354
+ _cache[41] || (_cache[41] = createBaseVNode("option", { value: "LATIN1" }, "LATIN1", -1))
53992
54355
  ], 512), [[vModelSelect, newDatabase.value.options.encoding]])]),
53993
- createBaseVNode("div", _hoisted_105$2, [createBaseVNode("label", _hoisted_106$2, toDisplayString(_ctx.$t("connection.tablespace")), 1), withDirectives(createBaseVNode("input", {
54356
+ createBaseVNode("div", _hoisted_115$1, [createBaseVNode("label", _hoisted_116$1, toDisplayString(_ctx.$t("connection.tablespace")), 1), withDirectives(createBaseVNode("input", {
53994
54357
  type: "text",
53995
54358
  class: "form-control",
53996
54359
  "onUpdate:modelValue": _cache[11] || (_cache[11] = ($event) => newDatabase.value.options.tablespace = $event),
53997
54360
  placeholder: _ctx.$t("connection.tablespace")
53998
- }, null, 8, _hoisted_107$2), [[vModelText, newDatabase.value.options.tablespace]])])
54361
+ }, null, 8, _hoisted_117$1), [[vModelText, newDatabase.value.options.tablespace]])])
53999
54362
  ])) : createCommentVNode("", true),
54000
- __props.connection?.type === "mssql" ? (openBlock(), createElementBlock("div", _hoisted_108$2, [createBaseVNode("div", _hoisted_109$1, [_cache[41] || (_cache[41] = createBaseVNode("label", { class: "form-label" }, "排序规则", -1)), withDirectives(createBaseVNode("input", {
54363
+ __props.connection?.type === "mssql" ? (openBlock(), createElementBlock("div", _hoisted_118$1, [createBaseVNode("div", _hoisted_119$1, [_cache[42] || (_cache[42] = createBaseVNode("label", { class: "form-label" }, "排序规则", -1)), withDirectives(createBaseVNode("input", {
54001
54364
  type: "text",
54002
54365
  class: "form-control",
54003
54366
  "onUpdate:modelValue": _cache[12] || (_cache[12] = ($event) => newDatabase.value.options.collation = $event),
54004
54367
  placeholder: "排序规则"
54005
54368
  }, null, 512), [[vModelText, newDatabase.value.options.collation]])])])) : createCommentVNode("", true)
54006
54369
  ])]),
54007
- createBaseVNode("div", _hoisted_110$1, [createBaseVNode("button", {
54370
+ createBaseVNode("div", _hoisted_120$1, [createBaseVNode("button", {
54008
54371
  type: "button",
54009
54372
  class: "btn btn-secondary",
54010
54373
  onClick: _cache[13] || (_cache[13] = ($event) => showCreateDatabase.value = false)
@@ -54013,7 +54376,26 @@ var init_connection_detail_vue_vue_type_script_setup_true_lang = __esmMin((() =>
54013
54376
  class: "btn btn-primary",
54014
54377
  onClick: createDatabase,
54015
54378
  disabled: !newDatabase.value.name || creatingDatabase.value
54016
- }, [creatingDatabase.value ? (openBlock(), createElementBlock("span", _hoisted_112$1)) : createCommentVNode("", true), createTextVNode(" " + toDisplayString(_ctx.$t("common.create")), 1)], 8, _hoisted_111$1)])
54379
+ }, [creatingDatabase.value ? (openBlock(), createElementBlock("span", _hoisted_122$1)) : createCommentVNode("", true), createTextVNode(" " + toDisplayString(_ctx.$t("common.create")), 1)], 8, _hoisted_121$1)])
54380
+ ])])])) : createCommentVNode("", true),
54381
+ showLogs.value ? (openBlock(), createElementBlock("div", _hoisted_123$1, [createBaseVNode("div", _hoisted_124$1, [createBaseVNode("div", _hoisted_125$1, [
54382
+ createBaseVNode("div", _hoisted_126$1, [createBaseVNode("h5", _hoisted_127$1, toDisplayString(_ctx.$t("connection.logsTitle")), 1), createBaseVNode("button", {
54383
+ type: "button",
54384
+ class: "btn-close",
54385
+ onClick: _cache[14] || (_cache[14] = ($event) => showLogs.value = false)
54386
+ })]),
54387
+ createBaseVNode("div", _hoisted_128, [loadingLogs.value ? (openBlock(), createElementBlock("div", _hoisted_129, [_cache[43] || (_cache[43] = createBaseVNode("span", { class: "spinner-border spinner-border-sm me-2" }, null, -1)), createTextVNode(" " + toDisplayString(_ctx.$t("common.loading")), 1)])) : !connectionLogs.value.length ? (openBlock(), createElementBlock("div", _hoisted_130, toDisplayString(_ctx.$t("connection.logsEmpty")), 1)) : (openBlock(), createElementBlock("div", _hoisted_131, [createBaseVNode("table", _hoisted_132, [createBaseVNode("thead", null, [createBaseVNode("tr", null, [(openBlock(true), createElementBlock(Fragment, null, renderList(logColumns.value, (col) => {
54388
+ return openBlock(), createElementBlock("th", { key: col }, toDisplayString(col), 1);
54389
+ }), 128))])]), createBaseVNode("tbody", null, [(openBlock(true), createElementBlock(Fragment, null, renderList(connectionLogs.value, (row, i) => {
54390
+ return openBlock(), createElementBlock("tr", { key: i }, [(openBlock(true), createElementBlock(Fragment, null, renderList(logColumns.value, (col) => {
54391
+ return openBlock(), createElementBlock("td", { key: col }, toDisplayString(formatLogCell(row, col)), 1);
54392
+ }), 128))]);
54393
+ }), 128))])])]))]),
54394
+ createBaseVNode("div", _hoisted_133, [createBaseVNode("button", {
54395
+ type: "button",
54396
+ class: "btn btn-secondary",
54397
+ onClick: _cache[15] || (_cache[15] = ($event) => showLogs.value = false)
54398
+ }, toDisplayString(_ctx.$t("common.close")), 1)])
54017
54399
  ])])])) : createCommentVNode("", true)
54018
54400
  ]);
54019
54401
  };
@@ -54021,17 +54403,17 @@ var init_connection_detail_vue_vue_type_script_setup_true_lang = __esmMin((() =>
54021
54403
  });
54022
54404
  }));
54023
54405
  //#endregion
54024
- //#region src/platform/database/components/connection-detail.vue?vue&type=style&index=0&scoped=ef9effac&lang.css
54025
- var init_connection_detail_vue_vue_type_style_index_0_scoped_ef9effac_lang = __esmMin((() => {}));
54406
+ //#region src/platform/database/components/connection-detail.vue?vue&type=style&index=0&scoped=0f93f920&lang.css
54407
+ var init_connection_detail_vue_vue_type_style_index_0_scoped_0f93f920_lang = __esmMin((() => {}));
54026
54408
  //#endregion
54027
54409
  //#region src/platform/database/components/connection-detail.vue
54028
54410
  var connection_detail_default;
54029
54411
  var init_connection_detail = __esmMin((() => {
54030
54412
  init_connection_detail_vue_vue_type_script_setup_true_lang();
54031
54413
  init_connection_detail_vue_vue_type_script_setup_true_lang();
54032
- init_connection_detail_vue_vue_type_style_index_0_scoped_ef9effac_lang();
54414
+ init_connection_detail_vue_vue_type_style_index_0_scoped_0f93f920_lang();
54033
54415
  init__plugin_vue_export_helper();
54034
- connection_detail_default = /*#__PURE__*/ _plugin_vue_export_helper_default(connection_detail_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-ef9effac"]]);
54416
+ connection_detail_default = /*#__PURE__*/ _plugin_vue_export_helper_default(connection_detail_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-0f93f920"]]);
54035
54417
  }));
54036
54418
  //#endregion
54037
54419
  //#region src/typings/database-types.ts
@@ -55177,102 +55559,14 @@ var init_database_types$1 = __esmMin((() => {
55177
55559
  };
55178
55560
  }));
55179
55561
  //#endregion
55180
- //#region src/utils/database-types.ts
55181
- /**
55182
- * 检查是否为数值类型
55183
- */
55184
- function isNumericType(type) {
55185
- return [
55186
- "int",
55187
- "integer",
55188
- "tinyint",
55189
- "smallint",
55190
- "mediumint",
55191
- "bigint",
55192
- "decimal",
55193
- "numeric",
55194
- "float",
55195
- "double",
55196
- "real",
55197
- "number",
55198
- "smallserial",
55199
- "serial",
55200
- "bigserial",
55201
- "money",
55202
- "smallmoney",
55203
- "binary_float",
55204
- "binary_double"
55205
- ].some((t) => type.toLowerCase().includes(t));
55206
- }
55207
- /**
55208
- * 检查是否为文本类型
55209
- */
55210
- function isTextType(type) {
55211
- return [
55212
- "text",
55213
- "longtext",
55214
- "mediumtext",
55215
- "tinytext",
55216
- "clob",
55217
- "nclob",
55218
- "ntext"
55219
- ].some((t) => type.toLowerCase().includes(t));
55220
- }
55221
- /**
55222
- * 检查是否为日期时间类型
55223
- */
55224
- function isDateTimeType(type) {
55225
- return [
55226
- "date",
55227
- "datetime",
55228
- "timestamp",
55229
- "time",
55230
- "year",
55231
- "time with time zone",
55232
- "timestamp with time zone",
55233
- "timestamp with local time zone",
55234
- "interval",
55235
- "datetimeoffset",
55236
- "datetime2",
55237
- "smalldatetime"
55238
- ].some((t) => type.toLowerCase().includes(t));
55239
- }
55240
- /**
55241
- * 检查是否为布尔类型
55242
- */
55243
- function isBooleanType(type) {
55244
- return [
55245
- "boolean",
55246
- "bool",
55247
- "bit",
55248
- "tinyint(1)"
55249
- ].some((t) => type.toLowerCase().includes(t));
55250
- }
55251
- /**
55252
- * 检查是否为JSON类型
55253
- */
55254
- function isJsonType(type) {
55255
- return ["json", "jsonb"].includes(type.toLowerCase());
55256
- }
55257
- /**
55258
- * 检查是否为数组类型
55259
- */
55260
- function isArrayType(type) {
55261
- return type.toLowerCase().endsWith("[]");
55262
- }
55263
- var init_database_types = __esmMin((() => {
55264
- init_database_types$1();
55265
- }));
55266
- //#endregion
55267
55562
  //#region src/platform/database/components/table-editor.vue?vue&type=script&setup=true&lang.ts
55268
- var _hoisted_1$6, _hoisted_2$6, _hoisted_3$6, _hoisted_4$6, _hoisted_5$6, _hoisted_6$6, _hoisted_7$6, _hoisted_8$6, _hoisted_9$6, _hoisted_10$6, _hoisted_11$6, _hoisted_12$6, _hoisted_13$6, _hoisted_14$6, _hoisted_15$6, _hoisted_16$6, _hoisted_17$6, _hoisted_18$6, _hoisted_19$6, _hoisted_20$6, _hoisted_21$6, _hoisted_22$6, _hoisted_23$6, _hoisted_24$6, _hoisted_25$6, _hoisted_26$5, _hoisted_27$5, _hoisted_28$5, _hoisted_29$5, _hoisted_30$4, _hoisted_31$4, _hoisted_32$4, _hoisted_33$4, _hoisted_34$4, _hoisted_35$4, _hoisted_36$4, _hoisted_37$4, _hoisted_38$4, _hoisted_39$4, _hoisted_40$4, _hoisted_41$4, _hoisted_42$4, _hoisted_43$4, _hoisted_44$4, _hoisted_45$4, _hoisted_46$4, _hoisted_47$4, _hoisted_48$3, _hoisted_49$3, _hoisted_50$3, _hoisted_51$3, _hoisted_52$3, _hoisted_53$3, CUSTOM_TYPE_VALUE, table_editor_vue_vue_type_script_setup_true_lang_default;
55563
+ var _hoisted_1$6, _hoisted_2$6, _hoisted_3$6, _hoisted_4$6, _hoisted_5$6, _hoisted_6$6, _hoisted_7$6, _hoisted_8$6, _hoisted_9$6, _hoisted_10$6, _hoisted_11$6, _hoisted_12$6, _hoisted_13$6, _hoisted_14$6, _hoisted_15$6, _hoisted_16$6, _hoisted_17$6, _hoisted_18$6, _hoisted_19$6, _hoisted_20$6, _hoisted_21$6, _hoisted_22$6, _hoisted_23$6, _hoisted_24$6, _hoisted_25$6, _hoisted_26$5, _hoisted_27$5, _hoisted_28$5, _hoisted_29$5, _hoisted_30$4, _hoisted_31$4, _hoisted_32$4, _hoisted_33$4, _hoisted_34$4, _hoisted_35$4, _hoisted_36$4, _hoisted_37$4, _hoisted_38$4, _hoisted_39$4, _hoisted_40$4, _hoisted_41$4, _hoisted_42$4, _hoisted_43$4, _hoisted_44$4, _hoisted_45$4, _hoisted_46$4, _hoisted_47$3, _hoisted_48$3, _hoisted_49$3, _hoisted_50$3, _hoisted_51$3, _hoisted_52$3, _hoisted_53$3, _hoisted_54$3, _hoisted_55$3, _hoisted_56$3, CUSTOM_TYPE_VALUE, table_editor_vue_vue_type_script_setup_true_lang_default;
55269
55564
  var init_table_editor_vue_vue_type_script_setup_true_lang = __esmMin((() => {
55270
55565
  init_vue_runtime_esm_bundler();
55271
55566
  init_vue_i18n();
55272
55567
  init_database();
55273
55568
  init_modal();
55274
55569
  init_database_types$1();
55275
- init_database_types();
55276
55570
  _hoisted_1$6 = {
55277
55571
  key: 0,
55278
55572
  class: "modal fade show",
@@ -55295,7 +55589,11 @@ var init_table_editor_vue_vue_type_script_setup_true_lang = __esmMin((() => {
55295
55589
  _hoisted_13$6 = { class: "col-md-6" };
55296
55590
  _hoisted_14$6 = { class: "mb-3" };
55297
55591
  _hoisted_15$6 = { class: "form-label" };
55298
- _hoisted_16$6 = ["placeholder"];
55592
+ _hoisted_16$6 = [
55593
+ "disabled",
55594
+ "title",
55595
+ "placeholder"
55596
+ ];
55299
55597
  _hoisted_17$6 = { class: "columns-section" };
55300
55598
  _hoisted_18$6 = { class: "section-header d-flex justify-content-between align-items-center mb-3" };
55301
55599
  _hoisted_19$6 = { class: "section-title mb-0" };
@@ -55309,7 +55607,12 @@ var init_table_editor_vue_vue_type_script_setup_true_lang = __esmMin((() => {
55309
55607
  _hoisted_27$5 = { width: "80" };
55310
55608
  _hoisted_28$5 = { width: "80" };
55311
55609
  _hoisted_29$5 = { width: "100" };
55312
- _hoisted_30$4 = ["onUpdate:modelValue", "placeholder"];
55610
+ _hoisted_30$4 = [
55611
+ "onUpdate:modelValue",
55612
+ "disabled",
55613
+ "title",
55614
+ "placeholder"
55615
+ ];
55313
55616
  _hoisted_31$4 = ["onUpdate:modelValue"];
55314
55617
  _hoisted_32$4 = { value: "" };
55315
55618
  _hoisted_33$4 = ["label"];
@@ -55330,15 +55633,33 @@ var init_table_editor_vue_vue_type_script_setup_true_lang = __esmMin((() => {
55330
55633
  _hoisted_42$4 = ["onUpdate:modelValue"];
55331
55634
  _hoisted_43$4 = ["onUpdate:modelValue", "placeholder"];
55332
55635
  _hoisted_44$4 = { class: "form-check" };
55333
- _hoisted_45$4 = ["onUpdate:modelValue", "onChange"];
55636
+ _hoisted_45$4 = [
55637
+ "onUpdate:modelValue",
55638
+ "disabled",
55639
+ "title",
55640
+ "onChange"
55641
+ ];
55334
55642
  _hoisted_46$4 = { class: "form-check" };
55335
- _hoisted_47$4 = ["onUpdate:modelValue", "disabled"];
55336
- _hoisted_48$3 = ["onUpdate:modelValue", "placeholder"];
55643
+ _hoisted_47$3 = [
55644
+ "onUpdate:modelValue",
55645
+ "disabled",
55646
+ "title",
55647
+ "onChange"
55648
+ ];
55649
+ _hoisted_48$3 = [
55650
+ "onUpdate:modelValue",
55651
+ "disabled",
55652
+ "title",
55653
+ "placeholder"
55654
+ ];
55337
55655
  _hoisted_49$3 = ["onClick", "disabled"];
55338
55656
  _hoisted_50$3 = { class: "sql-preview-section mt-4" };
55339
- _hoisted_51$3 = { class: "section-title" };
55340
- _hoisted_52$3 = { class: "sql-preview" };
55341
- _hoisted_53$3 = { class: "modal-footer" };
55657
+ _hoisted_51$3 = { class: "d-flex align-items-center justify-content-between" };
55658
+ _hoisted_52$3 = { class: "section-title mb-0" };
55659
+ _hoisted_53$3 = ["disabled"];
55660
+ _hoisted_54$3 = { class: "sql-preview mt-2" };
55661
+ _hoisted_55$3 = { class: "modal-footer" };
55662
+ _hoisted_56$3 = ["disabled", "title"];
55342
55663
  CUSTOM_TYPE_VALUE = "__custom__";
55343
55664
  table_editor_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
55344
55665
  __name: "table-editor",
@@ -55356,35 +55677,10 @@ var init_table_editor_vue_vue_type_script_setup_true_lang = __esmMin((() => {
55356
55677
  const emit = __emit;
55357
55678
  const databaseService = new DatabaseService();
55358
55679
  const { t } = useI18n();
55359
- const dbType = computed(() => (props.connection?.type || "").toLowerCase());
55360
- const MYSQL_LIKE_TYPES = /* @__PURE__ */ new Set([
55361
- "mysql",
55362
- "mariadb",
55363
- "aurora-mysql",
55364
- "auroramysql"
55365
- ]);
55366
- const POSTGRES_LIKE_TYPES = /* @__PURE__ */ new Set([
55367
- "postgres",
55368
- "postgresql",
55369
- "cockroachdb",
55370
- "aurora-postgres",
55371
- "aurorapostgres",
55372
- "aurora-postgresql"
55373
- ]);
55374
- const isMySqlLike = () => MYSQL_LIKE_TYPES.has(dbType.value);
55375
- const isPostgresLike = () => POSTGRES_LIKE_TYPES.has(dbType.value);
55376
55680
  function rawType(column) {
55377
55681
  if (!column) return "";
55378
55682
  return column.type === CUSTOM_TYPE_VALUE ? column.customType || "" : column.type || "";
55379
55683
  }
55380
- function sqlType(column) {
55381
- const type = rawType(column);
55382
- if (dbType.value === "sqlite" && column?.isAutoIncrement && /^INT$/i.test(type.trim())) return "INTEGER";
55383
- return type;
55384
- }
55385
- function escapeSqlString(value) {
55386
- return String(value ?? "").replace(/'/g, "''");
55387
- }
55388
55684
  const columnTypes = computed(() => {
55389
55685
  if (!props.connection) return [];
55390
55686
  return getColumnTypesByName(props.connection.type);
@@ -55414,11 +55710,6 @@ var init_table_editor_vue_vue_type_script_setup_true_lang = __esmMin((() => {
55414
55710
  comment: ""
55415
55711
  }]
55416
55712
  });
55417
- const originalTableData = ref({
55418
- tableName: "",
55419
- tableComment: "",
55420
- columns: []
55421
- });
55422
55713
  function parseColumnType(typeStr) {
55423
55714
  const result = { baseType: typeStr };
55424
55715
  if (!typeStr) return result;
@@ -55459,7 +55750,6 @@ var init_table_editor_vue_vue_type_script_setup_true_lang = __esmMin((() => {
55459
55750
  }) || []
55460
55751
  };
55461
55752
  formData.value = { ...tableData };
55462
- originalTableData.value = JSON.parse(JSON.stringify(tableData));
55463
55753
  } else {
55464
55754
  const isCreateWithPrefill = props.mode === "create" && props.table;
55465
55755
  formData.value = {
@@ -55479,115 +55769,92 @@ var init_table_editor_vue_vue_type_script_setup_true_lang = __esmMin((() => {
55479
55769
  comment: ""
55480
55770
  }]
55481
55771
  };
55482
- originalTableData.value = {
55483
- tableName: "",
55484
- tableComment: "",
55485
- columns: []
55486
- };
55487
55772
  }
55488
55773
  }
55489
- function isColumnDefinitionChanged(newCol, originalCol) {
55490
- return newCol.type !== originalCol.type || newCol.customType !== originalCol.customType || newCol.length !== originalCol.length || newCol.precision !== originalCol.precision || newCol.scale !== originalCol.scale || newCol.nullable !== originalCol.nullable || newCol.defaultValue !== originalCol.defaultValue || newCol.isPrimary !== originalCol.isPrimary || newCol.isAutoIncrement !== originalCol.isAutoIncrement || newCol.comment !== originalCol.comment;
55491
- }
55492
- function levenshtein(a, b) {
55493
- const m = a.length;
55494
- const n = b.length;
55495
- if (m === 0) return n;
55496
- if (n === 0) return m;
55497
- let prev = new Array(n + 1).fill(0);
55498
- let curr = new Array(n + 1).fill(0);
55499
- for (let j = 0; j <= n; j++) prev[j] = j;
55500
- for (let i = 1; i <= m; i++) {
55501
- curr[0] = i;
55502
- const aChar = a.charAt(i - 1);
55503
- for (let j = 1; j <= n; j++) {
55504
- const cost = aChar === b.charAt(j - 1) ? 0 : 1;
55505
- curr[j] = Math.min(curr[j - 1] + 1, prev[j] + 1, prev[j - 1] + cost);
55506
- }
55507
- const tmp = prev;
55508
- prev = curr;
55509
- curr = tmp;
55510
- }
55511
- return prev[n];
55512
- }
55513
- function renameNameScore(oldName, newName) {
55514
- const a = String(oldName || "").trim().toLowerCase();
55515
- const b = String(newName || "").trim().toLowerCase();
55516
- if (!a || !b || a === b) return 0;
55517
- if (a.startsWith(b) || b.startsWith(a)) return 3;
55518
- const maxLen = Math.max(a.length, b.length);
55519
- if (maxLen > 0 && levenshtein(a, b) <= Math.max(1, Math.floor(maxLen / 3))) return 1;
55520
- return 0;
55521
- }
55522
55774
  /**
55523
- * 重命名检测:把「新增列」与「删除列」中名称相近的配成对。
55524
- * 否则改名会被生成为 DROP COLUMN + ADD COLUMN,导致原数据丢失。
55775
+ * 目标态组装:UI 表单 -> TableSpec(前端唯一的职责)。
55776
+ * 原始态由后端实时读取,diff/SQL 生成全部在后端 schema 引擎完成——
55777
+ * 前端不再持有"旧结构缓存",缓存过期导致的错误语句从机制上消除。
55525
55778
  */
55526
- function matchRenamedColumns(addedColumns, deletedColumns) {
55527
- const pairs = [];
55528
- const usedOld = /* @__PURE__ */ new Set();
55529
- addedColumns.forEach((newCol, newIndex) => {
55530
- let bestOld = null;
55531
- let bestScore = 0;
55532
- deletedColumns.forEach((oldCol, oldIndex) => {
55533
- if (usedOld.has(oldCol)) return;
55534
- const score = renameNameScore(oldCol.name, newCol.name);
55535
- if (score === 0) return;
55536
- const total = score + (oldIndex === newIndex ? .1 : 0);
55537
- if (total > bestScore) {
55538
- bestScore = total;
55539
- bestOld = oldCol;
55540
- }
55541
- });
55542
- if (bestOld) {
55543
- usedOld.add(bestOld);
55544
- pairs.push({
55545
- oldColumn: bestOld,
55546
- newColumn: newCol
55547
- });
55779
+ function buildTableSpec() {
55780
+ const columns = formData.value.columns.filter((col) => col.name && rawType(col)).map((col) => {
55781
+ const raw = rawType(col).trim();
55782
+ const isCustom = col.type === CUSTOM_TYPE_VALUE;
55783
+ const hasDefault = col.defaultValue !== "" && col.defaultValue !== null && col.defaultValue !== void 0;
55784
+ const spec = {
55785
+ name: col.name.trim(),
55786
+ type: isCustom ? raw : col.type,
55787
+ nullable: col.nullable,
55788
+ hasDefault,
55789
+ autoIncrement: !!col.isAutoIncrement
55790
+ };
55791
+ if (isCustom) spec.customType = raw;
55792
+ else {
55793
+ if (col.length !== "" && col.length !== null && col.length !== void 0) spec.length = col.length;
55794
+ if (col.precision !== null && col.precision !== void 0 && col.precision !== "") spec.precision = col.precision;
55795
+ if (col.scale !== null && col.scale !== void 0 && col.scale !== "") spec.scale = col.scale;
55548
55796
  }
55797
+ if (hasDefault) spec.defaultValue = String(col.defaultValue);
55798
+ if (col.comment) spec.comment = col.comment;
55799
+ return spec;
55549
55800
  });
55550
- return pairs;
55551
- }
55552
- function calculateTableDiff() {
55553
- const diff = {
55554
- tableName: formData.value.tableName,
55555
- tableCommentChanged: formData.value.tableComment !== originalTableData.value.tableComment,
55556
- tableComment: formData.value.tableComment,
55557
- columnOrder: formData.value.columns.map((c) => c.name).filter(Boolean),
55558
- addedColumns: [],
55559
- modifiedColumns: [],
55560
- deletedColumns: [],
55561
- renamedColumns: []
55562
- };
55563
- const originalColumnsMap = /* @__PURE__ */ new Map();
55564
- originalTableData.value.columns.forEach((col) => {
55565
- originalColumnsMap.set(col.name, col);
55566
- });
55567
- formData.value.columns.forEach((newCol) => {
55568
- const originalCol = originalColumnsMap.get(newCol.name);
55569
- if (!originalCol) diff.addedColumns.push(newCol);
55570
- else if (isColumnDefinitionChanged(newCol, originalCol)) diff.modifiedColumns.push({
55571
- oldColumn: originalCol,
55572
- newColumn: newCol
55573
- });
55574
- });
55575
- const deletedColumns = originalTableData.value.columns.filter((originalCol) => !formData.value.columns.some((newCol) => newCol.name === originalCol.name));
55576
- const renamedColumns = matchRenamedColumns(diff.addedColumns, deletedColumns);
55577
- if (renamedColumns.length > 0) {
55578
- const renamedNewNames = new Set(renamedColumns.map((r) => r.newColumn));
55579
- const renamedOldColumns = new Set(renamedColumns.map((r) => r.oldColumn));
55580
- diff.renamedColumns = renamedColumns;
55581
- diff.addedColumns = diff.addedColumns.filter((col) => !renamedNewNames.has(col));
55582
- diff.deletedColumns = deletedColumns.filter((col) => !renamedOldColumns.has(col));
55583
- renamedColumns.forEach(({ oldColumn, newColumn }) => {
55584
- if (isColumnDefinitionChanged(newColumn, oldColumn)) diff.modifiedColumns.push({
55585
- oldColumn,
55586
- newColumn
55587
- });
55588
- });
55589
- } else diff.deletedColumns = deletedColumns;
55590
- return diff;
55801
+ return {
55802
+ name: formData.value.tableName.trim(),
55803
+ comment: formData.value.tableComment ?? "",
55804
+ columns,
55805
+ primaryKey: formData.value.columns.filter((c) => c.isPrimary && c.name).map((c) => c.name.trim())
55806
+ };
55807
+ }
55808
+ const previewSql = ref("-- 完善表单后将在此显示后端生成的 SQL");
55809
+ const caps = ref(null);
55810
+ let previewTimer = null;
55811
+ let previewSeq = 0;
55812
+ async function refreshPreview() {
55813
+ if (!props.connection?.id) return;
55814
+ if (props.mode === "edit" && !props.table?.name) return;
55815
+ if (!formData.value.tableName) return;
55816
+ if (formData.value.columns.some((col) => col.name && !rawType(col))) {
55817
+ previewSql.value = "-- 请完善字段信息(列名与类型)后再查看 SQL";
55818
+ return;
55819
+ }
55820
+ const seq = ++previewSeq;
55821
+ const spec = buildTableSpec();
55822
+ try {
55823
+ const data = props.mode === "create" ? await databaseService.previewCreateTable(props.connection.id, props.database, spec) : await databaseService.previewAlterTable(props.connection.id, props.database, props.table.name, spec);
55824
+ if (seq !== previewSeq) return;
55825
+ if (data?.capabilities) caps.value = data.capabilities;
55826
+ previewSql.value = data?.preview || (props.mode === "create" ? "-- 完善表单后将在此显示建表 SQL" : "没有检测到任何修改");
55827
+ } catch (error) {
55828
+ if (seq !== previewSeq) return;
55829
+ previewSql.value = `预览失败: ${error?.message || error}`;
55830
+ }
55831
+ }
55832
+ watch(formData, () => {
55833
+ if (previewTimer) clearTimeout(previewTimer);
55834
+ previewTimer = setTimeout(refreshPreview, 500);
55835
+ }, { deep: true });
55836
+ const tableCommentDisabled = computed(() => caps.value?.tableComment === false);
55837
+ const columnCommentDisabled = computed(() => caps.value?.columnComment === false);
55838
+ const pkDisabled = computed(() => props.mode === "edit" && caps.value?.alterPrimaryKey === false);
55839
+ const renameDisabled = computed(() => props.mode === "edit" && caps.value?.renameColumn === false);
55840
+ const submitDisabled = computed(() => props.mode === "create" && caps.value?.createTable === false || props.mode === "edit" && caps.value?.alterStrategy === "unsupported");
55841
+ const submitDisabledHint = computed(() => {
55842
+ if (props.mode === "create" && caps.value?.createTable === false) return "该数据库类型不支持通过 SQL 建表";
55843
+ if (props.mode === "edit" && caps.value?.alterStrategy === "unsupported") return "该数据库类型不支持在线修改表结构";
55844
+ return "";
55845
+ });
55846
+ const refreshingTables = ref(false);
55847
+ async function refreshTableList() {
55848
+ if (!props.connection?.id) return;
55849
+ refreshingTables.value = true;
55850
+ try {
55851
+ await databaseService.refreshTableCache(props.connection.id, props.database);
55852
+ await refreshPreview();
55853
+ } catch (error) {
55854
+ await modal.warning(`刷新表列表失败: ${error?.message || error}`);
55855
+ } finally {
55856
+ refreshingTables.value = false;
55857
+ }
55591
55858
  }
55592
55859
  function addColumn() {
55593
55860
  formData.value.columns.push({
@@ -55603,186 +55870,23 @@ var init_table_editor_vue_vue_type_script_setup_true_lang = __esmMin((() => {
55603
55870
  isAutoIncrement: false,
55604
55871
  comment: ""
55605
55872
  });
55873
+ refreshPreview();
55606
55874
  }
55607
55875
  function removeColumn(index) {
55608
- if (formData.value.columns.length > 1) formData.value.columns.splice(index, 1);
55876
+ if (formData.value.columns.length > 1) {
55877
+ formData.value.columns.splice(index, 1);
55878
+ refreshPreview();
55879
+ }
55609
55880
  }
55610
- function onPrimaryKeyChange(column, index) {
55611
- if (column.isPrimary) formData.value.columns.forEach((col, idx) => {
55612
- if (idx !== index) col.isPrimary = false;
55613
- });
55881
+ function onPrimaryKeyChange(column) {
55614
55882
  if (!column.isPrimary) column.isAutoIncrement = false;
55615
55883
  }
55616
- function generateSQL() {
55617
- if (!formData.value.tableName) return "请输入表名";
55618
- const quoteIdentifier = getQuoter();
55619
- if (props.mode === "create") {
55620
- const type = dbType.value;
55621
- const columnsSQL = formData.value.columns.filter((col) => col.name && rawType(col)).map((col) => buildColumnDefinition(col, quoteIdentifier)).join(",\n ");
55622
- if (!columnsSQL) return "请至少完善一个字段";
55623
- const primaryKeys = formData.value.columns.filter((col) => col.isPrimary && col.name).map((col) => quoteIdentifier(col.name));
55624
- const hasSqliteAutoIncrementPrimary = type === "sqlite" && formData.value.columns.some((col) => col.isAutoIncrement && col.isPrimary && col.name);
55625
- let sql = `CREATE TABLE ${quoteIdentifier(formData.value.tableName)} (\n ${columnsSQL}`;
55626
- if (primaryKeys.length > 0 && !hasSqliteAutoIncrementPrimary) sql += `,\n PRIMARY KEY (${primaryKeys.join(", ")})`;
55627
- sql += "\n)";
55628
- if (isMySqlLike()) {
55629
- if (formData.value.tableComment) sql += ` COMMENT='${escapeSqlString(formData.value.tableComment)}'`;
55630
- sql += " ENGINE=InnoDB DEFAULT CHARSET=utf8mb4";
55631
- }
55632
- const commentStatements = [];
55633
- if (formData.value.tableComment && (isPostgresLike() || dbType.value === "oracle")) commentStatements.push(`COMMENT ON TABLE ${quoteIdentifier(formData.value.tableName)} IS '${escapeSqlString(formData.value.tableComment)}'`);
55634
- formData.value.columns.forEach((col) => {
55635
- if (!col.name || !col.comment) return;
55636
- if (isPostgresLike() || dbType.value === "oracle") commentStatements.push(`COMMENT ON COLUMN ${quoteIdentifier(formData.value.tableName)}.${quoteIdentifier(col.name)} IS '${escapeSqlString(col.comment)}'`);
55637
- });
55638
- if (commentStatements.length > 0) sql += ";\n" + commentStatements.join(";\n");
55639
- return sql;
55640
- } else {
55641
- const diff = calculateTableDiff();
55642
- const tableName = diff.tableName;
55643
- const statements = [];
55644
- if (diff.tableCommentChanged && diff.tableComment) {
55645
- if (isMySqlLike()) statements.push(`ALTER TABLE ${quoteIdentifier(tableName)} COMMENT='${escapeSqlString(diff.tableComment)}'`);
55646
- else if (isPostgresLike() || dbType.value === "oracle") statements.push(`COMMENT ON TABLE ${quoteIdentifier(tableName)} IS '${escapeSqlString(diff.tableComment)}'`);
55647
- else if (dbType.value === "mssql" || dbType.value === "sqlserver") statements.push(`EXEC sp_addextendedproperty @name=N'MS_Description', @value=N'${escapeSqlString(diff.tableComment)}', @level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'${escapeSqlString(tableName)}'`);
55648
- }
55649
- diff.renamedColumns.forEach(({ oldColumn, newColumn }) => {
55650
- if (isMySqlLike()) statements.push(`ALTER TABLE ${quoteIdentifier(tableName)} CHANGE COLUMN ${quoteIdentifier(oldColumn.name)} ${quoteIdentifier(newColumn.name)} ${sqlType(newColumn)}${getTypeParams(newColumn)}${buildColumnAttributes(newColumn)}`);
55651
- else if (isPostgresLike()) statements.push(`ALTER TABLE ${quoteIdentifier(tableName)} RENAME COLUMN ${quoteIdentifier(oldColumn.name)} TO ${quoteIdentifier(newColumn.name)}`);
55652
- else if (dbType.value === "oracle") statements.push(`ALTER TABLE ${quoteIdentifier(tableName)} RENAME COLUMN ${quoteIdentifier(oldColumn.name)} TO ${quoteIdentifier(newColumn.name)}`);
55653
- else if (dbType.value === "mssql" || dbType.value === "sqlserver") statements.push(`EXEC sp_rename N'dbo.${escapeSqlString(tableName)}.${escapeSqlString(oldColumn.name)}', N'${escapeSqlString(newColumn.name)}', N'COLUMN'`);
55654
- else if (dbType.value === "sqlite") statements.push(`ALTER TABLE ${quoteIdentifier(tableName)} RENAME COLUMN ${quoteIdentifier(oldColumn.name)} TO ${quoteIdentifier(newColumn.name)}`);
55655
- });
55656
- diff.addedColumns.forEach((col) => {
55657
- const def = buildColumnAttributes(col);
55658
- if (dbType.value === "oracle") statements.push(`ALTER TABLE ${quoteIdentifier(tableName)} ADD (${quoteIdentifier(col.name)} ${sqlType(col)}${getTypeParams(col)}${def})`);
55659
- else if (dbType.value === "mssql" || dbType.value === "sqlserver") statements.push(`ALTER TABLE ${quoteIdentifier(tableName)} ADD ${quoteIdentifier(col.name)} ${sqlType(col)}${getTypeParams(col)}${def}`);
55660
- else statements.push(`ALTER TABLE ${quoteIdentifier(tableName)} ADD COLUMN ${quoteIdentifier(col.name)} ${sqlType(col)}${getTypeParams(col)}${def}`);
55661
- const colComment = buildColumnCommentStatement(col);
55662
- if (colComment) statements.push(colComment);
55663
- });
55664
- diff.modifiedColumns.forEach((modification) => {
55665
- const col = modification.newColumn;
55666
- const def = buildColumnAttributes(col);
55667
- if (isMySqlLike() && diff.renamedColumns.some((r) => r.oldColumn === modification.oldColumn)) return;
55668
- if (isMySqlLike()) statements.push(`ALTER TABLE ${quoteIdentifier(tableName)} MODIFY COLUMN ${quoteIdentifier(col.name)} ${sqlType(col)}${getTypeParams(col)}${def}`);
55669
- else if (isPostgresLike()) {
55670
- statements.push(`ALTER TABLE ${quoteIdentifier(tableName)} ALTER COLUMN ${quoteIdentifier(col.name)} TYPE ${sqlType(col)}${getTypeParams(col)}`);
55671
- statements.push(col.nullable ? `ALTER TABLE ${quoteIdentifier(tableName)} ALTER COLUMN ${quoteIdentifier(col.name)} DROP NOT NULL` : `ALTER TABLE ${quoteIdentifier(tableName)} ALTER COLUMN ${quoteIdentifier(col.name)} SET NOT NULL`);
55672
- if (col.defaultValue) statements.push(`ALTER TABLE ${quoteIdentifier(tableName)} ALTER COLUMN ${quoteIdentifier(col.name)} SET DEFAULT ${formatDefaultValue(col.defaultValue, sqlType(col))}`);
55673
- else statements.push(`ALTER TABLE ${quoteIdentifier(tableName)} ALTER COLUMN ${quoteIdentifier(col.name)} DROP DEFAULT`);
55674
- } else if (dbType.value === "mssql" || dbType.value === "sqlserver") {
55675
- statements.push(`ALTER TABLE ${quoteIdentifier(tableName)} ALTER COLUMN ${quoteIdentifier(col.name)} ${sqlType(col)}${getTypeParams(col)} ${col.nullable ? "NULL" : "NOT NULL"}`);
55676
- if (col.defaultValue) statements.push(`ALTER TABLE ${quoteIdentifier(tableName)} ADD CONSTRAINT DF_${tableName}_${col.name} DEFAULT ${formatDefaultValue(col.defaultValue, sqlType(col))} FOR ${quoteIdentifier(col.name)}`);
55677
- else statements.push(`ALTER TABLE ${quoteIdentifier(tableName)} DROP CONSTRAINT DF_${tableName}_${col.name}`);
55678
- } else if (dbType.value === "oracle") statements.push(`ALTER TABLE ${quoteIdentifier(tableName)} MODIFY (${quoteIdentifier(col.name)} ${sqlType(col)}${getTypeParams(col)}${def})`);
55679
- else if (dbType.value === "sqlite") statements.push(`-- SQLite 不支持直接修改列 "${col.name}",需要重建表`);
55680
- const colComment = buildColumnCommentStatement(col);
55681
- if (colComment) statements.push(colComment);
55682
- });
55683
- diff.deletedColumns.forEach((col) => {
55684
- if (dbType.value === "sqlite") statements.push(`-- SQLite 不支持直接删除列 "${col.name}",需要重建表`);
55685
- else statements.push(`ALTER TABLE ${quoteIdentifier(tableName)} DROP COLUMN ${quoteIdentifier(col.name)}`);
55686
- });
55687
- const oldPk = originalTableData.value.columns.filter((c) => c.isPrimary).map((c) => quoteIdentifier(c.name));
55688
- const newPk = formData.value.columns.filter((c) => c.isPrimary && c.name).map((c) => quoteIdentifier(c.name));
55689
- if (oldPk.join(",") !== newPk.join(",")) {
55690
- if (isMySqlLike()) {
55691
- statements.push(`ALTER TABLE ${quoteIdentifier(tableName)} DROP PRIMARY KEY`);
55692
- statements.push(`ALTER TABLE ${quoteIdentifier(tableName)} ADD PRIMARY KEY (${newPk.join(", ")})`);
55693
- } else if (isPostgresLike() || dbType.value === "oracle" || dbType.value === "mssql" || dbType.value === "sqlserver") {
55694
- statements.push(`-- 需要先手动删除旧主键约束,再执行:`);
55695
- statements.push(`ALTER TABLE ${quoteIdentifier(tableName)} ADD CONSTRAINT ${quoteIdentifier(`${tableName}_pkey`)} PRIMARY KEY (${newPk.join(", ")})`);
55696
- } else if (dbType.value === "sqlite") statements.push(`-- SQLite 修改主键需要重建表`);
55697
- }
55698
- if (statements.length === 0) return "没有检测到任何修改";
55699
- return statements.join(";\n") + ";";
55700
- }
55701
- }
55702
- function buildColumnAttributes(col) {
55703
- const type = sqlType(col);
55704
- let sql = "";
55705
- const isSqliteAutoIncrementPrimary = dbType.value === "sqlite" && col.isAutoIncrement && col.isPrimary;
55706
- if (!col.nullable && !isSqliteAutoIncrementPrimary) sql += " NOT NULL";
55707
- if (col.defaultValue) sql += ` DEFAULT ${formatDefaultValue(col.defaultValue, type)}`;
55708
- if (col.isAutoIncrement) {
55709
- if (isMySqlLike()) sql += " AUTO_INCREMENT";
55710
- else if (isPostgresLike()) {
55711
- if (!type.toLowerCase().includes("serial")) sql += " GENERATED ALWAYS AS IDENTITY";
55712
- } else if (dbType.value === "sqlite") sql += col.isPrimary ? " PRIMARY KEY AUTOINCREMENT" : " AUTOINCREMENT";
55713
- else if (dbType.value === "oracle") {
55714
- if (type.toLowerCase().includes("number")) sql += " GENERATED BY DEFAULT AS IDENTITY";
55715
- } else if (dbType.value === "mssql" || dbType.value === "sqlserver") sql += " IDENTITY(1,1)";
55716
- }
55717
- if (col.comment && isMySqlLike()) sql += ` COMMENT '${escapeSqlString(col.comment)}'`;
55718
- return sql;
55719
- }
55720
- function buildColumnDefinition(col, quoteIdentifier) {
55721
- return `${quoteIdentifier(col.name)} ${sqlType(col)}${getTypeParams(col)}${buildColumnAttributes(col)}`;
55722
- }
55723
- function buildColumnCommentStatement(col) {
55724
- if (!col.comment) return "";
55725
- const quoteIdentifier = getQuoter();
55726
- if (isPostgresLike() || dbType.value === "oracle") return `COMMENT ON COLUMN ${quoteIdentifier(formData.value.tableName)}.${quoteIdentifier(col.name)} IS '${escapeSqlString(col.comment)}'`;
55727
- if (dbType.value === "mssql" || dbType.value === "sqlserver") return `EXEC sp_addextendedproperty @name=N'MS_Description', @value=N'${escapeSqlString(col.comment)}', @level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'${escapeSqlString(formData.value.tableName)}', @level2type=N'COLUMN', @level2name=N'${escapeSqlString(col.name)}'`;
55728
- return "";
55729
- }
55730
- function getQuoter() {
55731
- return (name) => {
55732
- if (!props.connection) return `"${name}"`;
55733
- switch (dbType.value) {
55734
- case "mysql":
55735
- case "mariadb":
55736
- case "aurora-mysql":
55737
- case "auroramysql":
55738
- case "clickhouse":
55739
- case "click-house": return `\`${name}\``;
55740
- case "postgres":
55741
- case "postgresql":
55742
- case "cockroachdb":
55743
- case "aurora-postgres":
55744
- case "aurorapostgres":
55745
- case "aurora-postgresql":
55746
- case "sqlite": return `"${name}"`;
55747
- case "oracle": return `"${name.toUpperCase()}"`;
55748
- case "mssql":
55749
- case "sqlserver": return `[${name}]`;
55750
- default: return `"${name}"`;
55751
- }
55752
- };
55753
- }
55754
- const DEFAULT_KEYWORDS = /* @__PURE__ */ new Set([
55755
- "current_timestamp",
55756
- "now()",
55757
- "current_date",
55758
- "current_time",
55759
- "localtimestamp",
55760
- "localtime",
55761
- "current_user",
55762
- "sysdate",
55763
- "systimestamp",
55764
- "getdate()",
55765
- "getutcdate()",
55766
- "sysdatetime()",
55767
- "sysdatetimeoffset()",
55768
- "sysutcdatetime()",
55769
- "newid()",
55770
- "newsequentialid()",
55771
- "gen_random_uuid()",
55772
- "uuid_generate_v4()"
55773
- ]);
55774
- function formatDefaultValue(value, type) {
55775
- if (value === null || value === void 0 || value === "") return "NULL";
55776
- const raw = String(value).trim();
55777
- const lower = raw.toLowerCase();
55778
- if (lower === "null") return "NULL";
55779
- if (DEFAULT_KEYWORDS.has(lower)) return raw;
55780
- if (/^[a-z_][a-z0-9_]*\s*\(\s*\)$/.test(lower)) return raw;
55781
- if (/^current_timestamp\s*\(\s*\d+\s*\)$/.test(lower)) return raw;
55782
- const lowerType = type.toLowerCase();
55783
- if (isNumericType(lowerType) && !isNaN(Number(raw))) return raw;
55784
- if (isBooleanType(lowerType)) return value ? "TRUE" : "FALSE";
55785
- return `'${String(value).replace(/'/g, "''")}'`;
55884
+ function onAutoIncrementChange(column, index) {
55885
+ if (!column.isAutoIncrement) return;
55886
+ formData.value.columns.forEach((col, idx) => {
55887
+ col.isPrimary = idx === index;
55888
+ if (idx !== index) col.isAutoIncrement = false;
55889
+ });
55786
55890
  }
55787
55891
  async function submit() {
55788
55892
  try {
@@ -55798,30 +55902,28 @@ var init_table_editor_vue_vue_type_script_setup_true_lang = __esmMin((() => {
55798
55902
  await modal.warning("请先选择数据库连接");
55799
55903
  return;
55800
55904
  }
55801
- let result;
55802
- if (props.mode === "create") {
55803
- const sql = generateSQL();
55804
- result = await databaseService.executeQuery(props.connection.id, sql, props.database);
55805
- } else {
55806
- const tableDiff = calculateTableDiff();
55807
- if (tableDiff.addedColumns.length === 0 && tableDiff.modifiedColumns.length === 0 && tableDiff.deletedColumns.length === 0 && tableDiff.renamedColumns.length === 0 && !tableDiff.tableCommentChanged) {
55808
- await modal.info("没有检测到任何修改");
55809
- return;
55810
- }
55811
- result = await databaseService.alterTable(props.connection.id, props.database, tableDiff);
55905
+ const result = props.mode === "create" ? await databaseService.executeCreateTable(props.connection.id, props.database, buildTableSpec()) : await databaseService.executeAlterTable(props.connection.id, props.database, props.table.name, buildTableSpec());
55906
+ if (!result?.statements || result.statements.length === 0) {
55907
+ const liveCols = result?.liveColumns;
55908
+ const live = liveCols?.length ? liveCols.join("、") : "(未知)";
55909
+ const tip = liveCols?.length ? `当前实时表已有列:${live}\n若你以为新增的字段出现在上面,说明它之前已保存成功,或本来就存在。` : "未读取到实时表结构,请刷新表列表后重试。";
55910
+ await modal.info(`没有检测到任何修改。\n${tip}`);
55911
+ return;
55812
55912
  }
55813
55913
  emit("submit", {
55814
- success: result.ret === 0,
55815
- message: result.ret === 0 ? "操作成功" : "操作失败",
55816
- data: result.data,
55914
+ success: true,
55915
+ message: props.mode === "create" ? "表创建成功" : "表结构修改成功",
55916
+ data: result,
55817
55917
  mode: props.mode
55818
55918
  });
55819
55919
  close();
55820
55920
  } catch (error) {
55821
55921
  console.error("提交失败:", error);
55922
+ const message = error?.message || "操作失败";
55923
+ await modal.error(message);
55822
55924
  emit("submit", {
55823
55925
  success: false,
55824
- message: "操作失败",
55926
+ message,
55825
55927
  mode: props.mode
55826
55928
  });
55827
55929
  }
@@ -55830,7 +55932,12 @@ var init_table_editor_vue_vue_type_script_setup_true_lang = __esmMin((() => {
55830
55932
  emit("close");
55831
55933
  }
55832
55934
  watch(() => props.visible, (newVal) => {
55833
- if (newVal) initFormData();
55935
+ if (newVal) {
55936
+ initFormData();
55937
+ caps.value = null;
55938
+ previewSql.value = "-- 完善表单后将在此显示后端生成的 SQL";
55939
+ setTimeout(refreshPreview, 0);
55940
+ }
55834
55941
  });
55835
55942
  function getCategoryLabel(category) {
55836
55943
  return {
@@ -55867,22 +55974,6 @@ var init_table_editor_vue_vue_type_script_setup_true_lang = __esmMin((() => {
55867
55974
  function needsScale(column) {
55868
55975
  return getSelectedType(column)?.requiresScale || false;
55869
55976
  }
55870
- function getTypeParams(column) {
55871
- const raw = rawType(column);
55872
- if (!raw || raw.includes("(")) return "";
55873
- const typeInfo = getSelectedType(column);
55874
- if (typeInfo?.requiresPrecision) {
55875
- const precision = column.precision || typeInfo.defaultPrecision;
55876
- const scale = column.scale || typeInfo.defaultScale;
55877
- if (precision == null) return "";
55878
- return scale != null ? `(${precision},${scale})` : `(${precision})`;
55879
- }
55880
- if (typeInfo?.requiresLength) {
55881
- const length = column.length || typeInfo.defaultLength;
55882
- if (length != null) return `(${length})`;
55883
- }
55884
- return "";
55885
- }
55886
55977
  function supportsAutoIncrement(column) {
55887
55978
  return getSelectedType(column)?.supportsAutoIncrement || false;
55888
55979
  }
@@ -55914,6 +56005,8 @@ var init_table_editor_vue_vue_type_script_setup_true_lang = __esmMin((() => {
55914
56005
  "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => formData.value.tableComment = $event),
55915
56006
  type: "text",
55916
56007
  class: "form-control",
56008
+ disabled: tableCommentDisabled.value,
56009
+ title: tableCommentDisabled.value ? "该数据库不支持表注释" : void 0,
55917
56010
  placeholder: _ctx.$t("tableEditor.tableCommentPlaceholder")
55918
56011
  }, null, 8, _hoisted_16$6), [[vModelText, formData.value.tableComment]])])])])]),
55919
56012
  createBaseVNode("div", _hoisted_17$6, [createBaseVNode("div", _hoisted_18$6, [createBaseVNode("h6", _hoisted_19$6, toDisplayString(_ctx.$t("tableEditor.columnManagement")), 1), createBaseVNode("button", {
@@ -55935,6 +56028,8 @@ var init_table_editor_vue_vue_type_script_setup_true_lang = __esmMin((() => {
55935
56028
  "onUpdate:modelValue": ($event) => column.name = $event,
55936
56029
  type: "text",
55937
56030
  class: "form-control form-control-sm",
56031
+ disabled: renameDisabled.value,
56032
+ title: renameDisabled.value ? "该数据库不支持修改列名" : void 0,
55938
56033
  placeholder: _ctx.$t("tableEditor.columnNamePlaceholder")
55939
56034
  }, null, 8, _hoisted_30$4), [[vModelText, column.name]])]),
55940
56035
  createBaseVNode("td", null, [withDirectives(createBaseVNode("select", {
@@ -55999,18 +56094,24 @@ var init_table_editor_vue_vue_type_script_setup_true_lang = __esmMin((() => {
55999
56094
  "onUpdate:modelValue": ($event) => column.isPrimary = $event,
56000
56095
  type: "checkbox",
56001
56096
  class: "form-check-input",
56002
- onChange: ($event) => onPrimaryKeyChange(column, index)
56097
+ disabled: pkDisabled.value,
56098
+ title: pkDisabled.value ? "该数据库不支持在线修改主键" : void 0,
56099
+ onChange: ($event) => onPrimaryKeyChange(column)
56003
56100
  }, null, 40, _hoisted_45$4), [[vModelCheckbox, column.isPrimary]])])]),
56004
56101
  createBaseVNode("td", null, [createBaseVNode("div", _hoisted_46$4, [withDirectives(createBaseVNode("input", {
56005
56102
  "onUpdate:modelValue": ($event) => column.isAutoIncrement = $event,
56006
56103
  type: "checkbox",
56007
56104
  class: "form-check-input",
56008
- disabled: !column.isPrimary || !supportsAutoIncrement(column)
56009
- }, null, 8, _hoisted_47$4), [[vModelCheckbox, column.isAutoIncrement]])])]),
56105
+ disabled: !column.isPrimary || !supportsAutoIncrement(column),
56106
+ title: supportsAutoIncrement(column) ? "自增列将作为唯一主键" : void 0,
56107
+ onChange: ($event) => onAutoIncrementChange(column, index)
56108
+ }, null, 40, _hoisted_47$3), [[vModelCheckbox, column.isAutoIncrement]])])]),
56010
56109
  createBaseVNode("td", null, [withDirectives(createBaseVNode("input", {
56011
56110
  "onUpdate:modelValue": ($event) => column.comment = $event,
56012
56111
  type: "text",
56013
56112
  class: "form-control form-control-sm",
56113
+ disabled: columnCommentDisabled.value,
56114
+ title: columnCommentDisabled.value ? "该数据库不支持列注释" : void 0,
56014
56115
  placeholder: _ctx.$t("tableEditor.fieldComment")
56015
56116
  }, null, 8, _hoisted_48$3), [[vModelText, column.comment]])]),
56016
56117
  createBaseVNode("td", null, [createBaseVNode("button", {
@@ -56020,38 +56121,46 @@ var init_table_editor_vue_vue_type_script_setup_true_lang = __esmMin((() => {
56020
56121
  }, [..._cache[5] || (_cache[5] = [createBaseVNode("i", { class: "bi bi-trash" }, null, -1)])], 8, _hoisted_49$3)])
56021
56122
  ]);
56022
56123
  }), 128))])])])]),
56023
- createBaseVNode("div", _hoisted_50$3, [createBaseVNode("h6", _hoisted_51$3, toDisplayString(_ctx.$t("tableEditor.sqlPreview")), 1), createBaseVNode("pre", _hoisted_52$3, toDisplayString(generateSQL()), 1)])
56124
+ createBaseVNode("div", _hoisted_50$3, [createBaseVNode("div", _hoisted_51$3, [createBaseVNode("h6", _hoisted_52$3, toDisplayString(_ctx.$t("tableEditor.sqlPreview")), 1), createBaseVNode("button", {
56125
+ type: "button",
56126
+ class: "btn btn-sm btn-outline-secondary",
56127
+ disabled: refreshingTables.value,
56128
+ title: "重新拉取表列表(重名检测等依赖它;预览默认走 30 秒缓存)",
56129
+ onClick: refreshTableList
56130
+ }, toDisplayString(refreshingTables.value ? "刷新中..." : "刷新表列表"), 9, _hoisted_53$3)]), createBaseVNode("pre", _hoisted_54$3, toDisplayString(previewSql.value), 1)])
56024
56131
  ]),
56025
- createBaseVNode("div", _hoisted_53$3, [createBaseVNode("button", {
56132
+ createBaseVNode("div", _hoisted_55$3, [createBaseVNode("button", {
56026
56133
  type: "button",
56027
56134
  class: "btn btn-secondary",
56028
56135
  onClick: close
56029
56136
  }, toDisplayString(_ctx.$t("common.cancel")), 1), createBaseVNode("button", {
56030
56137
  type: "button",
56031
56138
  class: "btn btn-primary",
56139
+ disabled: submitDisabled.value,
56140
+ title: submitDisabledHint.value || void 0,
56032
56141
  onClick: submit
56033
- }, toDisplayString(_ctx.$t("common.save")), 1)])
56142
+ }, toDisplayString(_ctx.$t("common.save")), 9, _hoisted_56$3)])
56034
56143
  ])])])) : createCommentVNode("", true);
56035
56144
  };
56036
56145
  }
56037
56146
  });
56038
56147
  }));
56039
56148
  //#endregion
56040
- //#region src/platform/database/components/table-editor.vue?vue&type=style&index=0&scoped=b80d5611&lang.css
56041
- var init_table_editor_vue_vue_type_style_index_0_scoped_b80d5611_lang = __esmMin((() => {}));
56149
+ //#region src/platform/database/components/table-editor.vue?vue&type=style&index=0&scoped=5fb24ab7&lang.css
56150
+ var init_table_editor_vue_vue_type_style_index_0_scoped_5fb24ab7_lang = __esmMin((() => {}));
56042
56151
  //#endregion
56043
56152
  //#region src/platform/database/components/table-editor.vue
56044
56153
  var table_editor_default;
56045
56154
  var init_table_editor = __esmMin((() => {
56046
56155
  init_table_editor_vue_vue_type_script_setup_true_lang();
56047
56156
  init_table_editor_vue_vue_type_script_setup_true_lang();
56048
- init_table_editor_vue_vue_type_style_index_0_scoped_b80d5611_lang();
56157
+ init_table_editor_vue_vue_type_style_index_0_scoped_5fb24ab7_lang();
56049
56158
  init__plugin_vue_export_helper();
56050
- table_editor_default = /*#__PURE__*/ _plugin_vue_export_helper_default(table_editor_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-b80d5611"]]);
56159
+ table_editor_default = /*#__PURE__*/ _plugin_vue_export_helper_default(table_editor_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-5fb24ab7"]]);
56051
56160
  }));
56052
56161
  //#endregion
56053
56162
  //#region src/platform/database/components/db-tools.vue?vue&type=script&setup=true&lang.ts
56054
- var _hoisted_1$5, _hoisted_2$5, _hoisted_3$5, _hoisted_4$5, _hoisted_5$5, _hoisted_6$5, _hoisted_7$5, _hoisted_8$5, _hoisted_9$5, _hoisted_10$5, _hoisted_11$5, _hoisted_12$5, _hoisted_13$5, _hoisted_14$5, _hoisted_15$5, _hoisted_16$5, _hoisted_17$5, _hoisted_18$5, _hoisted_19$5, _hoisted_20$5, _hoisted_21$5, _hoisted_22$5, _hoisted_23$5, _hoisted_24$5, _hoisted_25$5, _hoisted_26$4, _hoisted_27$4, _hoisted_28$4, _hoisted_29$4, _hoisted_30$3, _hoisted_31$3, _hoisted_32$3, _hoisted_33$3, _hoisted_34$3, _hoisted_35$3, _hoisted_36$3, _hoisted_37$3, _hoisted_38$3, _hoisted_39$3, _hoisted_40$3, _hoisted_41$3, _hoisted_42$3, _hoisted_43$3, _hoisted_44$3, _hoisted_45$3, _hoisted_46$3, _hoisted_47$3, _hoisted_48$2, _hoisted_49$2, _hoisted_50$2, _hoisted_51$2, _hoisted_52$2, _hoisted_53$2, _hoisted_54$2, _hoisted_55$2, _hoisted_56$2, _hoisted_57$2, _hoisted_58$2, _hoisted_59$2, _hoisted_60$2, _hoisted_61$2, _hoisted_62$2, _hoisted_63$2, _hoisted_64$2, _hoisted_65$2, _hoisted_66$2, _hoisted_67$2, _hoisted_68$2, _hoisted_69$2, _hoisted_70$2, _hoisted_71$2, _hoisted_72$2, _hoisted_73$2, _hoisted_74$1, _hoisted_75$1, _hoisted_76$1, _hoisted_77$1, _hoisted_78$1, _hoisted_79$1, _hoisted_80$1, _hoisted_81$1, _hoisted_82$1, _hoisted_83$1, _hoisted_84$1, _hoisted_85$1, _hoisted_86$1, _hoisted_87$1, _hoisted_88$1, _hoisted_89$1, _hoisted_90$1, _hoisted_91$1, _hoisted_92$1, _hoisted_93$1, _hoisted_94$1, _hoisted_95$1, _hoisted_96$1, _hoisted_97$1, _hoisted_98$1, _hoisted_99$1, _hoisted_100$1, _hoisted_101$1, _hoisted_102$1, _hoisted_103$1, _hoisted_104$1, _hoisted_105$1, _hoisted_106$1, _hoisted_107$1, _hoisted_108$1, db_tools_vue_vue_type_script_setup_true_lang_default;
56163
+ var _hoisted_1$5, _hoisted_2$5, _hoisted_3$5, _hoisted_4$5, _hoisted_5$5, _hoisted_6$5, _hoisted_7$5, _hoisted_8$5, _hoisted_9$5, _hoisted_10$5, _hoisted_11$5, _hoisted_12$5, _hoisted_13$5, _hoisted_14$5, _hoisted_15$5, _hoisted_16$5, _hoisted_17$5, _hoisted_18$5, _hoisted_19$5, _hoisted_20$5, _hoisted_21$5, _hoisted_22$5, _hoisted_23$5, _hoisted_24$5, _hoisted_25$5, _hoisted_26$4, _hoisted_27$4, _hoisted_28$4, _hoisted_29$4, _hoisted_30$3, _hoisted_31$3, _hoisted_32$3, _hoisted_33$3, _hoisted_34$3, _hoisted_35$3, _hoisted_36$3, _hoisted_37$3, _hoisted_38$3, _hoisted_39$3, _hoisted_40$3, _hoisted_41$3, _hoisted_42$3, _hoisted_43$3, _hoisted_44$3, _hoisted_45$3, _hoisted_46$3, _hoisted_47$2, _hoisted_48$2, _hoisted_49$2, _hoisted_50$2, _hoisted_51$2, _hoisted_52$2, _hoisted_53$2, _hoisted_54$2, _hoisted_55$2, _hoisted_56$2, _hoisted_57$2, _hoisted_58$2, _hoisted_59$2, _hoisted_60$2, _hoisted_61$2, _hoisted_62$2, _hoisted_63$2, _hoisted_64$2, _hoisted_65$2, _hoisted_66$2, _hoisted_67$2, _hoisted_68$2, _hoisted_69$2, _hoisted_70$2, _hoisted_71$2, _hoisted_72$1, _hoisted_73$1, _hoisted_74$1, _hoisted_75$1, _hoisted_76$1, _hoisted_77$1, _hoisted_78$1, _hoisted_79$1, _hoisted_80$1, _hoisted_81$1, _hoisted_82$1, _hoisted_83$1, _hoisted_84$1, _hoisted_85$1, _hoisted_86$1, _hoisted_87$1, _hoisted_88$1, _hoisted_89$1, _hoisted_90$1, _hoisted_91$1, _hoisted_92$1, _hoisted_93$1, _hoisted_94$1, _hoisted_95$1, _hoisted_96$1, _hoisted_97$1, _hoisted_98$1, _hoisted_99$1, _hoisted_100$1, _hoisted_101$1, _hoisted_102$1, _hoisted_103$1, _hoisted_104$1, _hoisted_105$1, _hoisted_106$1, _hoisted_107$1, _hoisted_108$1, db_tools_vue_vue_type_script_setup_true_lang_default;
56055
56164
  var init_db_tools_vue_vue_type_script_setup_true_lang = __esmMin((() => {
56056
56165
  init_vue_runtime_esm_bundler();
56057
56166
  init_vue_i18n();
@@ -56116,7 +56225,7 @@ var init_db_tools_vue_vue_type_script_setup_true_lang = __esmMin((() => {
56116
56225
  _hoisted_44$3 = { value: "" };
56117
56226
  _hoisted_45$3 = ["value"];
56118
56227
  _hoisted_46$3 = { class: "col-md-6" };
56119
- _hoisted_47$3 = { class: "form-label" };
56228
+ _hoisted_47$2 = { class: "form-label" };
56120
56229
  _hoisted_48$2 = { value: "" };
56121
56230
  _hoisted_49$2 = ["value"];
56122
56231
  _hoisted_50$2 = { class: "col-md-12" };
@@ -56144,11 +56253,11 @@ var init_db_tools_vue_vue_type_script_setup_true_lang = __esmMin((() => {
56144
56253
  _hoisted_69$2 = { class: "row g-3" };
56145
56254
  _hoisted_70$2 = { class: "col-md-6" };
56146
56255
  _hoisted_71$2 = { class: "form-check" };
56147
- _hoisted_72$2 = {
56256
+ _hoisted_72$1 = {
56148
56257
  class: "form-check-label",
56149
56258
  for: "syncStructure"
56150
56259
  };
56151
- _hoisted_73$2 = { class: "col-md-6" };
56260
+ _hoisted_73$1 = { class: "col-md-6" };
56152
56261
  _hoisted_74$1 = { class: "form-check" };
56153
56262
  _hoisted_75$1 = {
56154
56263
  class: "form-check-label",
@@ -56222,7 +56331,6 @@ var init_db_tools_vue_vue_type_script_setup_true_lang = __esmMin((() => {
56222
56331
  const { t } = useI18n();
56223
56332
  const connectionService = new ConnectionService();
56224
56333
  const props = __props;
56225
- const emit = __emit;
56226
56334
  const databaseService = new DatabaseService();
56227
56335
  const restoreModalVisible = ref(false);
56228
56336
  const selectedFile = ref(null);
@@ -56369,29 +56477,60 @@ var init_db_tools_vue_vue_type_script_setup_true_lang = __esmMin((() => {
56369
56477
  function showPermissionsModal() {
56370
56478
  addExecutionResult(t("dbTools.permissionMgmt"), "info", { message: t("dbTools.featureInDev", { feature: t("dbTools.permissionMgmt") }) });
56371
56479
  }
56372
- function showProcessList() {
56373
- const sql = "SHOW PROCESSLIST";
56374
- addExecutionResult(t("dbTools.processList"), "info", {
56480
+ /** 把查询结果规整成结果区可展示的结构(查询类为行数组,管理类为执行回执) */
56481
+ function toDisplayData(sql, data) {
56482
+ if (Array.isArray(data)) return {
56375
56483
  sql,
56376
- message: t("dbTools.sqlSent")
56377
- });
56378
- emit("execute-sql", sql);
56484
+ rowCount: data.length,
56485
+ rows: data
56486
+ };
56487
+ if (data && typeof data === "object") return {
56488
+ sql,
56489
+ ...data
56490
+ };
56491
+ return {
56492
+ sql,
56493
+ result: data
56494
+ };
56495
+ }
56496
+ /**
56497
+ * 工具页自己执行 SQL 并把结果写入结果区。
56498
+ * 旧实现只 emit('execute-sql') 交给上层编辑器执行,工具页仅留一句"已发送 SQL 查询",
56499
+ * 查询结果在工具页永远看不到;改为本地执行后不再向上 emit,避免同一条 SQL 被执行两次
56500
+ * (对 FLUSH LOGS 这类非幂等语句尤其重要)。
56501
+ */
56502
+ async function runSqlTool(operation, sql) {
56503
+ if (!props.connection?.id) {
56504
+ modal.warning(t("dbTools.selectConnectionFirst"));
56505
+ return;
56506
+ }
56507
+ try {
56508
+ const res = await databaseService.executeQuery(props.connection.id, sql, props.database);
56509
+ if (res.ret === 0) addExecutionResult(operation, "success", toDisplayData(sql, res.data));
56510
+ else {
56511
+ modal.error(res.msg || t("dbTools.execFailed"));
56512
+ addExecutionResult(operation, "error", {
56513
+ sql,
56514
+ ...formatError(res)
56515
+ });
56516
+ }
56517
+ } catch (error) {
56518
+ console.error(`${operation}失败:`, error);
56519
+ modal.error(error?.msg || error?.message || t("dbTools.execFailed"));
56520
+ addExecutionResult(operation, "error", {
56521
+ sql,
56522
+ ...formatError(error)
56523
+ });
56524
+ }
56525
+ }
56526
+ function showProcessList() {
56527
+ runSqlTool(t("dbTools.processList"), "SHOW PROCESSLIST");
56379
56528
  }
56380
56529
  function showSlowQueries() {
56381
- const sql = "SELECT * FROM mysql.slow_log ORDER BY start_time DESC LIMIT 10";
56382
- addExecutionResult(t("dbTools.slowQueries"), "info", {
56383
- sql,
56384
- message: t("dbTools.sqlSent")
56385
- });
56386
- emit("execute-sql", sql);
56530
+ runSqlTool(t("dbTools.slowQueries"), "SELECT * FROM mysql.slow_log ORDER BY start_time DESC LIMIT 10");
56387
56531
  }
56388
56532
  function showConnectionsList() {
56389
- const sql = "SHOW STATUS LIKE \"Threads_connected\"";
56390
- addExecutionResult(t("dbTools.connectionCount"), "info", {
56391
- sql,
56392
- message: t("dbTools.sqlSent")
56393
- });
56394
- emit("execute-sql", sql);
56533
+ runSqlTool(t("dbTools.connectionCount"), "SHOW STATUS LIKE \"Threads_connected\"");
56395
56534
  }
56396
56535
  async function optimizeDatabase() {
56397
56536
  const operation = t("dbTools.optimizeDatabase");
@@ -56439,18 +56578,12 @@ var init_db_tools_vue_vue_type_script_setup_true_lang = __esmMin((() => {
56439
56578
  }
56440
56579
  }
56441
56580
  async function clearLogs() {
56442
- t("dbTools.clearLogs");
56443
- [
56581
+ const operation = t("dbTools.clearLogs");
56582
+ for (const sql of [
56444
56583
  "TRUNCATE TABLE mysql.slow_log",
56445
56584
  "TRUNCATE TABLE mysql.general_log",
56446
56585
  "FLUSH LOGS"
56447
- ].forEach((sql) => {
56448
- addExecutionResult(`${t("dbTools.clearLogs")} - ${sql.split(" ")[1]}`, "info", {
56449
- sql,
56450
- message: t("dbTools.sqlSent")
56451
- });
56452
- emit("execute-sql", sql);
56453
- });
56586
+ ]) await runSqlTool(`${operation} - ${sql.split(" ")[1]}`, sql);
56454
56587
  }
56455
56588
  function showExportModal() {
56456
56589
  addExecutionResult(t("dbTools.exportStructure"), "info", { message: t("dbTools.featureInDev", { feature: t("dbTools.exportStructure") }) });
@@ -56495,7 +56628,7 @@ var init_db_tools_vue_vue_type_script_setup_true_lang = __esmMin((() => {
56495
56628
  addExecutionResult(operation, "success", { checks: results });
56496
56629
  }
56497
56630
  function showStatistics() {
56498
- const sql = `
56631
+ runSqlTool(t("dbTools.dataStatistics"), `
56499
56632
  SELECT
56500
56633
  table_name as '表名',
56501
56634
  table_rows as '记录数',
@@ -56503,20 +56636,10 @@ var init_db_tools_vue_vue_type_script_setup_true_lang = __esmMin((() => {
56503
56636
  FROM information_schema.tables
56504
56637
  WHERE table_schema = DATABASE()
56505
56638
  ORDER BY (data_length + index_length) DESC
56506
- `;
56507
- addExecutionResult(t("dbTools.dataStatistics"), "info", {
56508
- sql,
56509
- message: t("dbTools.sqlSent")
56510
- });
56511
- emit("execute-sql", sql);
56639
+ `);
56512
56640
  }
56513
56641
  function showAuditLog() {
56514
- const sql = "SELECT * FROM mysql.general_log ORDER BY event_time DESC LIMIT 100";
56515
- addExecutionResult(t("dbTools.auditLog"), "info", {
56516
- sql,
56517
- message: t("dbTools.sqlSent")
56518
- });
56519
- emit("execute-sql", sql);
56642
+ runSqlTool(t("dbTools.auditLog"), "SELECT * FROM mysql.general_log ORDER BY event_time DESC LIMIT 100");
56520
56643
  }
56521
56644
  function showRestoreModal() {
56522
56645
  restoreModalVisible.value = true;
@@ -56766,7 +56889,7 @@ var init_db_tools_vue_vue_type_script_setup_true_lang = __esmMin((() => {
56766
56889
  value: conn.id
56767
56890
  }, toDisplayString(conn.name) + " (" + toDisplayString(conn.type) + ")", 9, _hoisted_45$3);
56768
56891
  }), 128))], 512), [[vModelSelect, selectedConnectionId.value]])]),
56769
- createBaseVNode("div", _hoisted_46$3, [createBaseVNode("label", _hoisted_47$3, toDisplayString(_ctx.$t("dbTools.selectDatabaseLabel")), 1), withDirectives(createBaseVNode("select", {
56892
+ createBaseVNode("div", _hoisted_46$3, [createBaseVNode("label", _hoisted_47$2, toDisplayString(_ctx.$t("dbTools.selectDatabaseLabel")), 1), withDirectives(createBaseVNode("select", {
56770
56893
  class: "form-select",
56771
56894
  "onUpdate:modelValue": _cache[5] || (_cache[5] = ($event) => selectedDatabaseName.value = $event)
56772
56895
  }, [createBaseVNode("option", _hoisted_48$2, toDisplayString(_ctx.$t("dbTools.selectDatabasePlaceholder")), 1), (openBlock(true), createElementBlock(Fragment, null, renderList(databases.value, (db) => {
@@ -56784,7 +56907,7 @@ var init_db_tools_vue_vue_type_script_setup_true_lang = __esmMin((() => {
56784
56907
  createBaseVNode("div", _hoisted_53$2, [createBaseVNode("label", _hoisted_54$2, toDisplayString(_ctx.$t("dbTools.dbTypeLabel")), 1), withDirectives(createBaseVNode("select", {
56785
56908
  class: "form-select",
56786
56909
  "onUpdate:modelValue": _cache[7] || (_cache[7] = ($event) => syncConfig.value.target.dbType = $event)
56787
- }, [..._cache[51] || (_cache[51] = [createStaticVNode("<option value=\"mysql\" data-v-a123948c>MySQL</option><option value=\"postgresql\" data-v-a123948c>PostgreSQL</option><option value=\"sqlite\" data-v-a123948c>SQLite</option><option value=\"sqlserver\" data-v-a123948c>SQL Server</option><option value=\"oracle\" data-v-a123948c>Oracle</option>", 5)])], 512), [[vModelSelect, syncConfig.value.target.dbType]])]),
56910
+ }, [..._cache[51] || (_cache[51] = [createStaticVNode("<option value=\"mysql\" data-v-4c55e089>MySQL</option><option value=\"postgresql\" data-v-4c55e089>PostgreSQL</option><option value=\"sqlite\" data-v-4c55e089>SQLite</option><option value=\"sqlserver\" data-v-4c55e089>SQL Server</option><option value=\"oracle\" data-v-4c55e089>Oracle</option>", 5)])], 512), [[vModelSelect, syncConfig.value.target.dbType]])]),
56788
56911
  createBaseVNode("div", _hoisted_55$2, [createBaseVNode("label", _hoisted_56$2, toDisplayString(_ctx.$t("dbTools.hostLabel")), 1), withDirectives(createBaseVNode("input", {
56789
56912
  type: "text",
56790
56913
  class: "form-control",
@@ -56823,8 +56946,8 @@ var init_db_tools_vue_vue_type_script_setup_true_lang = __esmMin((() => {
56823
56946
  class: "form-check-input",
56824
56947
  "onUpdate:modelValue": _cache[14] || (_cache[14] = ($event) => syncConfig.value.options.syncStructure = $event),
56825
56948
  id: "syncStructure"
56826
- }, null, 512), [[vModelCheckbox, syncConfig.value.options.syncStructure]]), createBaseVNode("label", _hoisted_72$2, toDisplayString(_ctx.$t("dbTools.syncStructure")), 1)])]),
56827
- createBaseVNode("div", _hoisted_73$2, [createBaseVNode("div", _hoisted_74$1, [withDirectives(createBaseVNode("input", {
56949
+ }, null, 512), [[vModelCheckbox, syncConfig.value.options.syncStructure]]), createBaseVNode("label", _hoisted_72$1, toDisplayString(_ctx.$t("dbTools.syncStructure")), 1)])]),
56950
+ createBaseVNode("div", _hoisted_73$1, [createBaseVNode("div", _hoisted_74$1, [withDirectives(createBaseVNode("input", {
56828
56951
  type: "checkbox",
56829
56952
  class: "form-check-input",
56830
56953
  "onUpdate:modelValue": _cache[15] || (_cache[15] = ($event) => syncConfig.value.options.syncData = $event),
@@ -56924,21 +57047,21 @@ var init_db_tools_vue_vue_type_script_setup_true_lang = __esmMin((() => {
56924
57047
  });
56925
57048
  }));
56926
57049
  //#endregion
56927
- //#region src/platform/database/components/db-tools.vue?vue&type=style&index=0&scoped=a123948c&lang.css
56928
- var init_db_tools_vue_vue_type_style_index_0_scoped_a123948c_lang = __esmMin((() => {}));
57050
+ //#region src/platform/database/components/db-tools.vue?vue&type=style&index=0&scoped=4c55e089&lang.css
57051
+ var init_db_tools_vue_vue_type_style_index_0_scoped_4c55e089_lang = __esmMin((() => {}));
56929
57052
  //#endregion
56930
57053
  //#region src/platform/database/components/db-tools.vue
56931
57054
  var db_tools_default;
56932
57055
  var init_db_tools = __esmMin((() => {
56933
57056
  init_db_tools_vue_vue_type_script_setup_true_lang();
56934
57057
  init_db_tools_vue_vue_type_script_setup_true_lang();
56935
- init_db_tools_vue_vue_type_style_index_0_scoped_a123948c_lang();
57058
+ init_db_tools_vue_vue_type_style_index_0_scoped_4c55e089_lang();
56936
57059
  init__plugin_vue_export_helper();
56937
- db_tools_default = /*#__PURE__*/ _plugin_vue_export_helper_default(db_tools_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-a123948c"]]);
57060
+ db_tools_default = /*#__PURE__*/ _plugin_vue_export_helper_default(db_tools_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-4c55e089"]]);
56938
57061
  }));
56939
57062
  //#endregion
56940
57063
  //#region src/platform/database/components/database-detail.vue?vue&type=script&setup=true&lang.ts
56941
- var _hoisted_1$4, _hoisted_2$4, _hoisted_3$4, _hoisted_4$4, _hoisted_5$4, _hoisted_6$4, _hoisted_7$4, _hoisted_8$4, _hoisted_9$4, _hoisted_10$4, _hoisted_11$4, _hoisted_12$4, _hoisted_13$4, _hoisted_14$4, _hoisted_15$4, _hoisted_16$4, _hoisted_17$4, _hoisted_18$4, _hoisted_19$4, _hoisted_20$4, _hoisted_21$4, _hoisted_22$4, _hoisted_23$4, _hoisted_24$4, _hoisted_25$4, _hoisted_26$3, _hoisted_27$3, _hoisted_28$3, _hoisted_29$3, _hoisted_30$2, _hoisted_31$2, _hoisted_32$2, _hoisted_33$2, _hoisted_34$2, _hoisted_35$2, _hoisted_36$2, _hoisted_37$2, _hoisted_38$2, _hoisted_39$2, _hoisted_40$2, _hoisted_41$2, _hoisted_42$2, _hoisted_43$2, _hoisted_44$2, _hoisted_45$2, _hoisted_46$2, _hoisted_47$2, _hoisted_48$1, _hoisted_49$1, _hoisted_50$1, _hoisted_51$1, _hoisted_52$1, _hoisted_53$1, _hoisted_54$1, _hoisted_55$1, _hoisted_56$1, _hoisted_57$1, _hoisted_58$1, _hoisted_59$1, _hoisted_60$1, _hoisted_61$1, _hoisted_62$1, _hoisted_63$1, _hoisted_64$1, _hoisted_65$1, _hoisted_66$1, _hoisted_67$1, _hoisted_68$1, _hoisted_69$1, _hoisted_70$1, _hoisted_71$1, _hoisted_72$1, _hoisted_73$1, _hoisted_74, _hoisted_75, _hoisted_76, _hoisted_77, _hoisted_78, _hoisted_79, _hoisted_80, _hoisted_81, _hoisted_82, _hoisted_83, _hoisted_84, _hoisted_85, _hoisted_86, _hoisted_87, _hoisted_88, _hoisted_89, _hoisted_90, _hoisted_91, _hoisted_92, _hoisted_93, _hoisted_94, _hoisted_95, _hoisted_96, _hoisted_97, _hoisted_98, _hoisted_99, _hoisted_100, _hoisted_101, _hoisted_102, _hoisted_103, _hoisted_104, _hoisted_105, _hoisted_106, _hoisted_107, _hoisted_108, _hoisted_109, _hoisted_110, _hoisted_111, _hoisted_112, _hoisted_113, _hoisted_114, _hoisted_115, _hoisted_116, _hoisted_117, _hoisted_118, _hoisted_119, _hoisted_120, _hoisted_121, _hoisted_122, _hoisted_123, _hoisted_124, _hoisted_125, _hoisted_126, _hoisted_127, database_detail_vue_vue_type_script_setup_true_lang_default;
57064
+ var _hoisted_1$4, _hoisted_2$4, _hoisted_3$4, _hoisted_4$4, _hoisted_5$4, _hoisted_6$4, _hoisted_7$4, _hoisted_8$4, _hoisted_9$4, _hoisted_10$4, _hoisted_11$4, _hoisted_12$4, _hoisted_13$4, _hoisted_14$4, _hoisted_15$4, _hoisted_16$4, _hoisted_17$4, _hoisted_18$4, _hoisted_19$4, _hoisted_20$4, _hoisted_21$4, _hoisted_22$4, _hoisted_23$4, _hoisted_24$4, _hoisted_25$4, _hoisted_26$3, _hoisted_27$3, _hoisted_28$3, _hoisted_29$3, _hoisted_30$2, _hoisted_31$2, _hoisted_32$2, _hoisted_33$2, _hoisted_34$2, _hoisted_35$2, _hoisted_36$2, _hoisted_37$2, _hoisted_38$2, _hoisted_39$2, _hoisted_40$2, _hoisted_41$2, _hoisted_42$2, _hoisted_43$2, _hoisted_44$2, _hoisted_45$2, _hoisted_46$2, _hoisted_47$1, _hoisted_48$1, _hoisted_49$1, _hoisted_50$1, _hoisted_51$1, _hoisted_52$1, _hoisted_53$1, _hoisted_54$1, _hoisted_55$1, _hoisted_56$1, _hoisted_57$1, _hoisted_58$1, _hoisted_59$1, _hoisted_60$1, _hoisted_61$1, _hoisted_62$1, _hoisted_63$1, _hoisted_64$1, _hoisted_65$1, _hoisted_66$1, _hoisted_67$1, _hoisted_68$1, _hoisted_69$1, _hoisted_70$1, _hoisted_71$1, _hoisted_72, _hoisted_73, _hoisted_74, _hoisted_75, _hoisted_76, _hoisted_77, _hoisted_78, _hoisted_79, _hoisted_80, _hoisted_81, _hoisted_82, _hoisted_83, _hoisted_84, _hoisted_85, _hoisted_86, _hoisted_87, _hoisted_88, _hoisted_89, _hoisted_90, _hoisted_91, _hoisted_92, _hoisted_93, _hoisted_94, _hoisted_95, _hoisted_96, _hoisted_97, _hoisted_98, _hoisted_99, _hoisted_100, _hoisted_101, _hoisted_102, _hoisted_103, _hoisted_104, _hoisted_105, _hoisted_106, _hoisted_107, _hoisted_108, _hoisted_109, _hoisted_110, _hoisted_111, _hoisted_112, _hoisted_113, _hoisted_114, _hoisted_115, _hoisted_116, _hoisted_117, _hoisted_118, _hoisted_119, _hoisted_120, _hoisted_121, _hoisted_122, _hoisted_123, _hoisted_124, _hoisted_125, _hoisted_126, _hoisted_127, database_detail_vue_vue_type_script_setup_true_lang_default;
56942
57065
  var init_database_detail_vue_vue_type_script_setup_true_lang = __esmMin((() => {
56943
57066
  init_vue_runtime_esm_bundler();
56944
57067
  init_vue_i18n();
@@ -56992,22 +57115,22 @@ var init_database_detail_vue_vue_type_script_setup_true_lang = __esmMin((() => {
56992
57115
  _hoisted_37$2 = ["title"];
56993
57116
  _hoisted_38$2 = { class: "table-engine" };
56994
57117
  _hoisted_39$2 = ["title"];
56995
- _hoisted_40$2 = { class: "card-body" };
56996
- _hoisted_41$2 = { class: "table-stats" };
56997
- _hoisted_42$2 = {
57118
+ _hoisted_40$2 = { class: "table-actions" };
57119
+ _hoisted_41$2 = ["onClick", "title"];
57120
+ _hoisted_42$2 = { class: "card-body" };
57121
+ _hoisted_43$2 = { class: "table-stats" };
57122
+ _hoisted_44$2 = {
56998
57123
  key: 0,
56999
57124
  class: "stat"
57000
57125
  };
57001
- _hoisted_43$2 = { class: "stat-label" };
57002
- _hoisted_44$2 = { class: "stat-value" };
57003
- _hoisted_45$2 = {
57126
+ _hoisted_45$2 = { class: "stat-label" };
57127
+ _hoisted_46$2 = { class: "stat-value" };
57128
+ _hoisted_47$1 = {
57004
57129
  key: 1,
57005
57130
  class: "stat"
57006
57131
  };
57007
- _hoisted_46$2 = { class: "stat-label" };
57008
- _hoisted_47$2 = { class: "stat-value" };
57009
- _hoisted_48$1 = { class: "table-actions" };
57010
- _hoisted_49$1 = ["onClick"];
57132
+ _hoisted_48$1 = { class: "stat-label" };
57133
+ _hoisted_49$1 = { class: "stat-value" };
57011
57134
  _hoisted_50$1 = {
57012
57135
  key: 0,
57013
57136
  class: "empty-state"
@@ -57048,11 +57171,11 @@ var init_database_detail_vue_vue_type_script_setup_true_lang = __esmMin((() => {
57048
57171
  };
57049
57172
  _hoisted_70$1 = { class: "procedure-type" };
57050
57173
  _hoisted_71$1 = { class: "badge bg-info" };
57051
- _hoisted_72$1 = {
57174
+ _hoisted_72 = {
57052
57175
  key: 0,
57053
57176
  class: "badge bg-secondary ms-1"
57054
57177
  };
57055
- _hoisted_73$1 = { class: "card-body" };
57178
+ _hoisted_73 = { class: "card-body" };
57056
57179
  _hoisted_74 = { class: "procedure-actions" };
57057
57180
  _hoisted_75 = ["onClick"];
57058
57181
  _hoisted_76 = ["onClick"];
@@ -57261,28 +57384,53 @@ var init_database_detail_vue_vue_type_script_setup_true_lang = __esmMin((() => {
57261
57384
  };
57262
57385
  showCreateView.value = true;
57263
57386
  }
57387
+ /**
57388
+ * 提取对象定义文本(视图/存储过程共用)。
57389
+ * 后端定义类接口返回的就是 SQL 字符串,并统一包装成 { ret, msg, data };
57390
+ * 这里兼容「字符串 / 数组 / { definition }」三种形态,避免取值路径变化导致编辑框空白。
57391
+ */
57392
+ function extractDefinition(result) {
57393
+ const raw = typeof result === "string" ? result : result?.data;
57394
+ if (typeof raw === "string") return raw;
57395
+ if (Array.isArray(raw)) return String(raw[0]?.definition ?? raw[0]?.ddl ?? "");
57396
+ if (raw && typeof raw === "object") return String(raw.definition ?? raw.ddl ?? raw.sql ?? "");
57397
+ return "";
57398
+ }
57264
57399
  async function editView(view) {
57265
57400
  try {
57266
- const result = await databaseService.getViewDefinition(props.connection?.id || "", props.database, view.name);
57401
+ const definition = extractDefinition(await databaseService.getViewDefinition(props.connection?.id || "", props.database, view.name));
57267
57402
  editingView.value = {
57268
57403
  name: view.name,
57269
- definition: result.data?.[0]?.definition || "",
57404
+ definition,
57270
57405
  comment: view.comment
57271
57406
  };
57272
57407
  showCreateView.value = true;
57408
+ if (!definition) modal.warning(t("databaseDetail.getViewDefFailed"));
57273
57409
  } catch (error) {
57274
57410
  console.error("获取视图定义失败:", error);
57275
57411
  modal.error(t("databaseDetail.getViewDefFailed"));
57276
57412
  }
57277
57413
  }
57414
+ /**
57415
+ * 视图定义归一为「AS 之后的部分」。
57416
+ * 各方言 getViewDefinition 返回的形态不同:MySQL/PG/MSSQL 只给 SELECT 片段,
57417
+ * 而 SQLite/Oracle 给的是完整 CREATE VIEW 语句——直接回传会被后端再拼一次
57418
+ * `CREATE VIEW <name> AS ...` 而变成语法错误,改名时还会沿用旧视图名。
57419
+ */
57420
+ function normalizeViewDefinition(definition) {
57421
+ const s = String(definition || "").trim();
57422
+ const m = /^CREATE\s+(?:OR\s+REPLACE\s+)?(?:ALGORITHM\s*=\s*\w+\s+)?(?:DEFINER\s*=\s*\S+\s+)?(?:SQL\s+SECURITY\s+\w+\s+)?VIEW\s+.+?\s+AS\s+/is.exec(s);
57423
+ return m ? s.slice(m[0].length).trim() : s;
57424
+ }
57278
57425
  async function createOrUpdateView() {
57279
57426
  if (!editingView.value?.name || !editingView.value?.definition) {
57280
57427
  modal.error(t("databaseDetail.fillViewNameAndDef"));
57281
57428
  return;
57282
57429
  }
57283
57430
  try {
57431
+ const definition = normalizeViewDefinition(editingView.value.definition);
57284
57432
  if (views.value.some((v) => v.name === editingView.value.name)) await databaseService.dropView(props.connection?.id || "", props.database, editingView.value.name);
57285
- const result = await databaseService.createView(props.connection?.id || "", props.database, editingView.value.name, editingView.value.definition);
57433
+ const result = await databaseService.createView(props.connection?.id || "", props.database, editingView.value.name, definition);
57286
57434
  if (result.success || result.ret === 0) {
57287
57435
  await modal.success(t("databaseDetail.viewSaveSuccess"));
57288
57436
  showCreateView.value = false;
@@ -57331,13 +57479,14 @@ var init_database_detail_vue_vue_type_script_setup_true_lang = __esmMin((() => {
57331
57479
  }
57332
57480
  async function editProcedure(procedure) {
57333
57481
  try {
57334
- const result = await databaseService.getProcedureDefinition(props.connection?.id || "", props.database, procedure.name);
57482
+ const definition = extractDefinition(await databaseService.getProcedureDefinition(props.connection?.id || "", props.database, procedure.name));
57335
57483
  editingProcedure.value = {
57336
57484
  name: procedure.name,
57337
- definition: result.data?.[0]?.definition || "",
57485
+ definition,
57338
57486
  comment: procedure.comment
57339
57487
  };
57340
57488
  showCreateProcedure.value = true;
57489
+ if (!definition) modal.warning(t("databaseDetail.getProcedureDefFailed"));
57341
57490
  } catch (error) {
57342
57491
  console.error("获取存储过程定义失败:", error);
57343
57492
  modal.error(t("databaseDetail.getProcedureDefFailed"));
@@ -57410,7 +57559,7 @@ var init_database_detail_vue_vue_type_script_setup_true_lang = __esmMin((() => {
57410
57559
  _cache[21] || (_cache[21] = createBaseVNode("i", { class: "bi bi-chevron-right" }, null, -1)),
57411
57560
  createBaseVNode("span", _hoisted_9$4, toDisplayString(__props.database), 1),
57412
57561
  createBaseVNode("span", _hoisted_10$4, toDisplayString(getDbTypeLabel(__props.connection?.type)), 1)
57413
- ])])]), createBaseVNode("div", _hoisted_11$4, [createBaseVNode("div", _hoisted_12$4, [createBaseVNode("div", _hoisted_13$4, toDisplayString(__props.databaseInfo?.tableCount || 0), 1), createBaseVNode("div", _hoisted_14$4, toDisplayString(_ctx.$t("connection.tableCount")), 1)]), createBaseVNode("div", _hoisted_15$4, [createBaseVNode("div", _hoisted_16$4, toDisplayString(formatSize(__props.databaseInfo?.size || 0)), 1), createBaseVNode("div", _hoisted_17$4, toDisplayString(_ctx.$t("databaseDetail.size")), 1)])])])]),
57562
+ ])])]), createBaseVNode("div", _hoisted_11$4, [createBaseVNode("div", _hoisted_12$4, [createBaseVNode("div", _hoisted_13$4, toDisplayString((tables.value || []).length), 1), createBaseVNode("div", _hoisted_14$4, toDisplayString(_ctx.$t("connection.tableCount")), 1)]), createBaseVNode("div", _hoisted_15$4, [createBaseVNode("div", _hoisted_16$4, toDisplayString(formatSize(__props.databaseInfo?.size || 0)), 1), createBaseVNode("div", _hoisted_17$4, toDisplayString(_ctx.$t("databaseDetail.size")), 1)])])])]),
57414
57563
  createBaseVNode("div", _hoisted_18$4, [createBaseVNode("ul", _hoisted_19$4, [
57415
57564
  createBaseVNode("li", _hoisted_20$4, [createBaseVNode("button", {
57416
57565
  class: normalizeClass(["nav-link", { active: activeTab.value === "tables" }]),
@@ -57444,17 +57593,22 @@ var init_database_detail_vue_vue_type_script_setup_true_lang = __esmMin((() => {
57444
57593
  key: table.name,
57445
57594
  class: "table-card",
57446
57595
  onClick: ($event) => selectTable(table)
57447
- }, [createBaseVNode("div", _hoisted_34$2, [_cache[30] || (_cache[30] = createBaseVNode("div", { class: "table-icon" }, [createBaseVNode("i", { class: "bi bi-table" })], -1)), createBaseVNode("div", _hoisted_35$2, [createBaseVNode("div", _hoisted_36$2, [createBaseVNode("div", {
57448
- class: "table-name",
57449
- title: table.name
57450
- }, toDisplayString(table.name), 9, _hoisted_37$2), createBaseVNode("div", _hoisted_38$2, toDisplayString(table.engine || "-"), 1)]), table.comment ? (openBlock(), createElementBlock("div", {
57451
- key: 0,
57452
- class: "table-comment-header",
57453
- title: table.comment
57454
- }, toDisplayString(table.comment), 9, _hoisted_39$2)) : createCommentVNode("", true)])]), createBaseVNode("div", _hoisted_40$2, [createBaseVNode("div", _hoisted_41$2, [table.rowCount !== void 0 ? (openBlock(), createElementBlock("div", _hoisted_42$2, [createBaseVNode("span", _hoisted_43$2, toDisplayString(_ctx.$t("databaseDetail.rowCountLabel")), 1), createBaseVNode("span", _hoisted_44$2, toDisplayString(formatNumber(table.rowCount)), 1)])) : createCommentVNode("", true), table.dataSize !== void 0 ? (openBlock(), createElementBlock("div", _hoisted_45$2, [createBaseVNode("span", _hoisted_46$2, toDisplayString(_ctx.$t("databaseDetail.size")), 1), createBaseVNode("span", _hoisted_47$2, toDisplayString(formatSize(table.dataSize)), 1)])) : createCommentVNode("", true)]), createBaseVNode("div", _hoisted_48$1, [createBaseVNode("button", {
57455
- class: "btn btn-sm btn-outline-primary",
57456
- onClick: withModifiers(($event) => editTable(table), ["stop"])
57457
- }, [..._cache[31] || (_cache[31] = [createBaseVNode("i", { class: "bi bi-pencil" }, null, -1)])], 8, _hoisted_49$1)])])], 8, _hoisted_33$2);
57596
+ }, [createBaseVNode("div", _hoisted_34$2, [
57597
+ _cache[31] || (_cache[31] = createBaseVNode("div", { class: "table-icon" }, [createBaseVNode("i", { class: "bi bi-table" })], -1)),
57598
+ createBaseVNode("div", _hoisted_35$2, [createBaseVNode("div", _hoisted_36$2, [createBaseVNode("div", {
57599
+ class: "table-name",
57600
+ title: table.name
57601
+ }, toDisplayString(table.name), 9, _hoisted_37$2), createBaseVNode("div", _hoisted_38$2, toDisplayString(table.engine || "-"), 1)]), table.comment ? (openBlock(), createElementBlock("div", {
57602
+ key: 0,
57603
+ class: "table-comment-header",
57604
+ title: table.comment
57605
+ }, toDisplayString(table.comment), 9, _hoisted_39$2)) : createCommentVNode("", true)]),
57606
+ createBaseVNode("div", _hoisted_40$2, [createBaseVNode("button", {
57607
+ class: "btn btn-sm btn-outline-primary",
57608
+ onClick: withModifiers(($event) => editTable(table), ["stop"]),
57609
+ title: _ctx.$t("common.edit")
57610
+ }, [..._cache[30] || (_cache[30] = [createBaseVNode("i", { class: "bi bi-pencil" }, null, -1)])], 8, _hoisted_41$2)])
57611
+ ]), createBaseVNode("div", _hoisted_42$2, [createBaseVNode("div", _hoisted_43$2, [table.rowCount !== void 0 ? (openBlock(), createElementBlock("div", _hoisted_44$2, [createBaseVNode("span", _hoisted_45$2, toDisplayString(_ctx.$t("databaseDetail.rowCountLabel")), 1), createBaseVNode("span", _hoisted_46$2, toDisplayString(formatNumber(table.rowCount)), 1)])) : createCommentVNode("", true), table.dataSize !== void 0 ? (openBlock(), createElementBlock("div", _hoisted_47$1, [createBaseVNode("span", _hoisted_48$1, toDisplayString(_ctx.$t("databaseDetail.size")), 1), createBaseVNode("span", _hoisted_49$1, toDisplayString(formatSize(table.dataSize)), 1)])) : createCommentVNode("", true)])])], 8, _hoisted_33$2);
57458
57612
  }), 128))]), !tables.value || tables.value.length === 0 ? (openBlock(), createElementBlock("div", _hoisted_50$1, [
57459
57613
  _cache[33] || (_cache[33] = createBaseVNode("i", { class: "bi bi-inbox" }, null, -1)),
57460
57614
  createBaseVNode("p", null, toDisplayString(_ctx.$t("databaseDetail.noTable")), 1),
@@ -57501,8 +57655,8 @@ var init_database_detail_vue_vue_type_script_setup_true_lang = __esmMin((() => {
57501
57655
  }, [createBaseVNode("div", _hoisted_66$1, [_cache[43] || (_cache[43] = createBaseVNode("div", { class: "procedure-icon" }, [createBaseVNode("i", { class: "bi bi-gear" })], -1)), createBaseVNode("div", _hoisted_67$1, [
57502
57656
  createBaseVNode("div", _hoisted_68$1, toDisplayString(procedure.name), 1),
57503
57657
  procedure.comment ? (openBlock(), createElementBlock("div", _hoisted_69$1, toDisplayString(procedure.comment), 1)) : createCommentVNode("", true),
57504
- createBaseVNode("div", _hoisted_70$1, [createBaseVNode("span", _hoisted_71$1, toDisplayString(procedure.type), 1), procedure.returnType ? (openBlock(), createElementBlock("span", _hoisted_72$1, toDisplayString(procedure.returnType), 1)) : createCommentVNode("", true)])
57505
- ])]), createBaseVNode("div", _hoisted_73$1, [createBaseVNode("div", _hoisted_74, [createBaseVNode("button", {
57658
+ createBaseVNode("div", _hoisted_70$1, [createBaseVNode("span", _hoisted_71$1, toDisplayString(procedure.type), 1), procedure.returnType ? (openBlock(), createElementBlock("span", _hoisted_72, toDisplayString(procedure.returnType), 1)) : createCommentVNode("", true)])
57659
+ ])]), createBaseVNode("div", _hoisted_73, [createBaseVNode("div", _hoisted_74, [createBaseVNode("button", {
57506
57660
  class: "btn btn-sm btn-outline-primary",
57507
57661
  onClick: ($event) => editProcedure(procedure)
57508
57662
  }, [_cache[44] || (_cache[44] = createBaseVNode("i", { class: "bi bi-pencil" }, null, -1)), createTextVNode(" " + toDisplayString(_ctx.$t("common.edit")), 1)], 8, _hoisted_75), createBaseVNode("button", {
@@ -57648,17 +57802,104 @@ var init_database_detail_vue_vue_type_script_setup_true_lang = __esmMin((() => {
57648
57802
  });
57649
57803
  }));
57650
57804
  //#endregion
57651
- //#region src/platform/database/components/database-detail.vue?vue&type=style&index=0&scoped=a6f90f39&lang.css
57652
- var init_database_detail_vue_vue_type_style_index_0_scoped_a6f90f39_lang = __esmMin((() => {}));
57805
+ //#region src/platform/database/components/database-detail.vue?vue&type=style&index=0&scoped=82eeefa1&lang.css
57806
+ var init_database_detail_vue_vue_type_style_index_0_scoped_82eeefa1_lang = __esmMin((() => {}));
57653
57807
  //#endregion
57654
57808
  //#region src/platform/database/components/database-detail.vue
57655
57809
  var database_detail_default;
57656
57810
  var init_database_detail = __esmMin((() => {
57657
57811
  init_database_detail_vue_vue_type_script_setup_true_lang();
57658
57812
  init_database_detail_vue_vue_type_script_setup_true_lang();
57659
- init_database_detail_vue_vue_type_style_index_0_scoped_a6f90f39_lang();
57813
+ init_database_detail_vue_vue_type_style_index_0_scoped_82eeefa1_lang();
57660
57814
  init__plugin_vue_export_helper();
57661
- database_detail_default = /*#__PURE__*/ _plugin_vue_export_helper_default(database_detail_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-a6f90f39"]]);
57815
+ database_detail_default = /*#__PURE__*/ _plugin_vue_export_helper_default(database_detail_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-82eeefa1"]]);
57816
+ }));
57817
+ //#endregion
57818
+ //#region src/utils/database-types.ts
57819
+ /**
57820
+ * 检查是否为数值类型
57821
+ */
57822
+ function isNumericType(type) {
57823
+ return [
57824
+ "int",
57825
+ "integer",
57826
+ "tinyint",
57827
+ "smallint",
57828
+ "mediumint",
57829
+ "bigint",
57830
+ "decimal",
57831
+ "numeric",
57832
+ "float",
57833
+ "double",
57834
+ "real",
57835
+ "number",
57836
+ "smallserial",
57837
+ "serial",
57838
+ "bigserial",
57839
+ "money",
57840
+ "smallmoney",
57841
+ "binary_float",
57842
+ "binary_double"
57843
+ ].some((t) => type.toLowerCase().includes(t));
57844
+ }
57845
+ /**
57846
+ * 检查是否为文本类型
57847
+ */
57848
+ function isTextType(type) {
57849
+ return [
57850
+ "text",
57851
+ "longtext",
57852
+ "mediumtext",
57853
+ "tinytext",
57854
+ "clob",
57855
+ "nclob",
57856
+ "ntext"
57857
+ ].some((t) => type.toLowerCase().includes(t));
57858
+ }
57859
+ /**
57860
+ * 检查是否为日期时间类型
57861
+ */
57862
+ function isDateTimeType(type) {
57863
+ return [
57864
+ "date",
57865
+ "datetime",
57866
+ "timestamp",
57867
+ "time",
57868
+ "year",
57869
+ "time with time zone",
57870
+ "timestamp with time zone",
57871
+ "timestamp with local time zone",
57872
+ "interval",
57873
+ "datetimeoffset",
57874
+ "datetime2",
57875
+ "smalldatetime"
57876
+ ].some((t) => type.toLowerCase().includes(t));
57877
+ }
57878
+ /**
57879
+ * 检查是否为布尔类型
57880
+ */
57881
+ function isBooleanType(type) {
57882
+ return [
57883
+ "boolean",
57884
+ "bool",
57885
+ "bit",
57886
+ "tinyint(1)"
57887
+ ].some((t) => type.toLowerCase().includes(t));
57888
+ }
57889
+ /**
57890
+ * 检查是否为JSON类型
57891
+ */
57892
+ function isJsonType(type) {
57893
+ return ["json", "jsonb"].includes(type.toLowerCase());
57894
+ }
57895
+ /**
57896
+ * 检查是否为数组类型
57897
+ */
57898
+ function isArrayType(type) {
57899
+ return type.toLowerCase().endsWith("[]");
57900
+ }
57901
+ var init_database_types = __esmMin((() => {
57902
+ init_database_types$1();
57662
57903
  }));
57663
57904
  //#endregion
57664
57905
  //#region src/platform/database/components/data-editor.vue?vue&type=script&setup=true&lang.ts
@@ -58396,7 +58637,7 @@ var init_table_data_grid = __esmMin((() => {
58396
58637
  }));
58397
58638
  //#endregion
58398
58639
  //#region src/platform/database/components/table-detail.vue?vue&type=script&setup=true&lang.ts
58399
- var _hoisted_1$1, _hoisted_2$1, _hoisted_3$1, _hoisted_4$1, _hoisted_5$1, _hoisted_6$1, _hoisted_7$1, _hoisted_8$1, _hoisted_9$1, _hoisted_10$1, _hoisted_11$1, _hoisted_12$1, _hoisted_13$1, _hoisted_14$1, _hoisted_15$1, _hoisted_16$1, _hoisted_17$1, _hoisted_18$1, _hoisted_19$1, _hoisted_20$1, _hoisted_21$1, _hoisted_22$1, _hoisted_23$1, _hoisted_24$1, _hoisted_25$1, _hoisted_26$1, _hoisted_27$1, _hoisted_28$1, _hoisted_29$1, _hoisted_30$1, _hoisted_31$1, _hoisted_32$1, _hoisted_33$1, _hoisted_34$1, _hoisted_35$1, _hoisted_36$1, _hoisted_37$1, _hoisted_38$1, _hoisted_39$1, _hoisted_40$1, _hoisted_41$1, _hoisted_42$1, _hoisted_43$1, _hoisted_44$1, _hoisted_45$1, _hoisted_46$1, _hoisted_47$1, _hoisted_48, _hoisted_49, _hoisted_50, _hoisted_51, _hoisted_52, _hoisted_53, _hoisted_54, _hoisted_55, _hoisted_56, _hoisted_57, _hoisted_58, _hoisted_59, _hoisted_60, _hoisted_61, _hoisted_62, _hoisted_63, _hoisted_64, _hoisted_65, _hoisted_66, _hoisted_67, _hoisted_68, _hoisted_69, _hoisted_70, _hoisted_71, _hoisted_72, _hoisted_73, table_detail_vue_vue_type_script_setup_true_lang_default;
58640
+ var _hoisted_1$1, _hoisted_2$1, _hoisted_3$1, _hoisted_4$1, _hoisted_5$1, _hoisted_6$1, _hoisted_7$1, _hoisted_8$1, _hoisted_9$1, _hoisted_10$1, _hoisted_11$1, _hoisted_12$1, _hoisted_13$1, _hoisted_14$1, _hoisted_15$1, _hoisted_16$1, _hoisted_17$1, _hoisted_18$1, _hoisted_19$1, _hoisted_20$1, _hoisted_21$1, _hoisted_22$1, _hoisted_23$1, _hoisted_24$1, _hoisted_25$1, _hoisted_26$1, _hoisted_27$1, _hoisted_28$1, _hoisted_29$1, _hoisted_30$1, _hoisted_31$1, _hoisted_32$1, _hoisted_33$1, _hoisted_34$1, _hoisted_35$1, _hoisted_36$1, _hoisted_37$1, _hoisted_38$1, _hoisted_39$1, _hoisted_40$1, _hoisted_41$1, _hoisted_42$1, _hoisted_43$1, _hoisted_44$1, _hoisted_45$1, _hoisted_46$1, _hoisted_47, _hoisted_48, _hoisted_49, _hoisted_50, _hoisted_51, _hoisted_52, _hoisted_53, _hoisted_54, _hoisted_55, _hoisted_56, _hoisted_57, _hoisted_58, _hoisted_59, _hoisted_60, _hoisted_61, _hoisted_62, _hoisted_63, _hoisted_64, _hoisted_65, _hoisted_66, _hoisted_67, _hoisted_68, _hoisted_69, _hoisted_70, _hoisted_71, table_detail_vue_vue_type_script_setup_true_lang_default;
58400
58641
  var init_table_detail_vue_vue_type_script_setup_true_lang = __esmMin((() => {
58401
58642
  init_vue_runtime_esm_bundler();
58402
58643
  init_vue_i18n();
@@ -58468,7 +58709,7 @@ var init_table_detail_vue_vue_type_script_setup_true_lang = __esmMin((() => {
58468
58709
  _hoisted_44$1 = { class: "table table-bordered" };
58469
58710
  _hoisted_45$1 = { class: "table-dark" };
58470
58711
  _hoisted_46$1 = { width: "100" };
58471
- _hoisted_47$1 = {
58712
+ _hoisted_47 = {
58472
58713
  key: 0,
58473
58714
  class: "badge bg-primary"
58474
58715
  };
@@ -58478,29 +58719,27 @@ var init_table_detail_vue_vue_type_script_setup_true_lang = __esmMin((() => {
58478
58719
  class: "badge bg-success"
58479
58720
  };
58480
58721
  _hoisted_50 = { key: 1 };
58481
- _hoisted_51 = { class: "btn-group btn-group-sm" };
58482
- _hoisted_52 = ["onClick"];
58483
- _hoisted_53 = ["onClick"];
58484
- _hoisted_54 = { class: "tab-panel" };
58485
- _hoisted_55 = { class: "indexes-content" };
58486
- _hoisted_56 = { class: "indexes-table" };
58487
- _hoisted_57 = { class: "table table-bordered" };
58488
- _hoisted_58 = { class: "table-dark" };
58489
- _hoisted_59 = { width: "100" };
58490
- _hoisted_60 = { class: "badge bg-info" };
58491
- _hoisted_61 = { class: "btn-group btn-group-sm" };
58492
- _hoisted_62 = ["onClick"];
58493
- _hoisted_63 = ["onClick"];
58494
- _hoisted_64 = { class: "tab-panel" };
58495
- _hoisted_65 = { class: "relations-content" };
58496
- _hoisted_66 = { class: "relations-table" };
58497
- _hoisted_67 = { class: "table table-bordered" };
58498
- _hoisted_68 = { class: "table-dark" };
58499
- _hoisted_69 = { width: "100" };
58500
- _hoisted_70 = { class: "btn-group btn-group-sm" };
58501
- _hoisted_71 = ["onClick"];
58502
- _hoisted_72 = { class: "tab-panel" };
58503
- _hoisted_73 = { class: "sql-section" };
58722
+ _hoisted_51 = ["title", "onClick"];
58723
+ _hoisted_52 = { class: "tab-panel" };
58724
+ _hoisted_53 = { class: "indexes-content" };
58725
+ _hoisted_54 = { class: "indexes-table" };
58726
+ _hoisted_55 = { class: "table table-bordered" };
58727
+ _hoisted_56 = { class: "table-dark" };
58728
+ _hoisted_57 = { width: "100" };
58729
+ _hoisted_58 = { class: "badge bg-info" };
58730
+ _hoisted_59 = { class: "btn-group btn-group-sm" };
58731
+ _hoisted_60 = ["onClick"];
58732
+ _hoisted_61 = ["onClick"];
58733
+ _hoisted_62 = { class: "tab-panel" };
58734
+ _hoisted_63 = { class: "relations-content" };
58735
+ _hoisted_64 = { class: "relations-table" };
58736
+ _hoisted_65 = { class: "table table-bordered" };
58737
+ _hoisted_66 = { class: "table-dark" };
58738
+ _hoisted_67 = { width: "100" };
58739
+ _hoisted_68 = { class: "btn-group btn-group-sm" };
58740
+ _hoisted_69 = ["onClick"];
58741
+ _hoisted_70 = { class: "tab-panel" };
58742
+ _hoisted_71 = { class: "sql-section" };
58504
58743
  table_detail_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
58505
58744
  __name: "table-detail",
58506
58745
  props: {
@@ -58728,15 +58967,6 @@ var init_table_detail_vue_vue_type_script_setup_true_lang = __esmMin((() => {
58728
58967
  tableEditorMode.value = "edit";
58729
58968
  showTableEditor.value = true;
58730
58969
  }
58731
- function deleteColumn(column) {
58732
- modal.confirm(t("tableDetail.confirmDeleteColumn", { name: column.name }), {
58733
- confirmButtonText: "删除",
58734
- cancelButtonText: "取消",
58735
- type: "danger"
58736
- }).then((result) => {
58737
- if (result) emit("refresh-structure");
58738
- });
58739
- }
58740
58970
  function editIndex(index) {
58741
58971
  console.log("编辑索引:", index);
58742
58972
  }
@@ -58997,47 +59227,45 @@ var init_table_detail_vue_vue_type_script_setup_true_lang = __esmMin((() => {
58997
59227
  createBaseVNode("td", null, [createBaseVNode("code", null, toDisplayString(column.type), 1)]),
58998
59228
  createBaseVNode("td", null, [createBaseVNode("span", { class: normalizeClass(column.nullable ? "text-warning" : "text-success") }, [createBaseVNode("i", { class: normalizeClass(column.nullable ? "bi bi-unlock" : "bi bi-lock-fill") }, null, 2), createTextVNode(" " + toDisplayString(column.nullable ? "YES" : "NO"), 1)], 2)]),
58999
59229
  createBaseVNode("td", null, toDisplayString(column.defaultValue || "-"), 1),
59000
- createBaseVNode("td", null, [column.isPrimary ? (openBlock(), createElementBlock("span", _hoisted_47$1, [_cache[37] || (_cache[37] = createBaseVNode("i", { class: "bi bi-key-fill" }, null, -1)), createTextVNode(" " + toDisplayString(_ctx.$t("tableDetail.primaryKeyHeader")), 1)])) : (openBlock(), createElementBlock("span", _hoisted_48, "-"))]),
59230
+ createBaseVNode("td", null, [column.isPrimary ? (openBlock(), createElementBlock("span", _hoisted_47, [_cache[37] || (_cache[37] = createBaseVNode("i", { class: "bi bi-key-fill" }, null, -1)), createTextVNode(" " + toDisplayString(_ctx.$t("tableDetail.primaryKeyHeader")), 1)])) : (openBlock(), createElementBlock("span", _hoisted_48, "-"))]),
59001
59231
  createBaseVNode("td", null, [column.isAutoIncrement ? (openBlock(), createElementBlock("span", _hoisted_49, [_cache[38] || (_cache[38] = createBaseVNode("i", { class: "bi bi-arrow-up-circle" }, null, -1)), createTextVNode(" " + toDisplayString(_ctx.$t("tableDetail.autoIncHeader")), 1)])) : (openBlock(), createElementBlock("span", _hoisted_50, "-"))]),
59002
59232
  createBaseVNode("td", null, toDisplayString(column.comment || "-"), 1),
59003
- createBaseVNode("td", null, [createBaseVNode("div", _hoisted_51, [createBaseVNode("button", {
59233
+ createBaseVNode("td", null, [createBaseVNode("button", {
59004
59234
  class: "btn btn-outline-primary btn-sm",
59235
+ title: _ctx.$t("tableDetail.modifyStructure"),
59005
59236
  onClick: ($event) => editColumn(column)
59006
- }, [..._cache[39] || (_cache[39] = [createBaseVNode("i", { class: "bi bi-pencil" }, null, -1)])], 8, _hoisted_52), createBaseVNode("button", {
59007
- class: "btn btn-outline-danger btn-sm",
59008
- onClick: ($event) => deleteColumn(column)
59009
- }, [..._cache[40] || (_cache[40] = [createBaseVNode("i", { class: "bi bi-trash" }, null, -1)])], 8, _hoisted_53)])])
59237
+ }, [..._cache[39] || (_cache[39] = [createBaseVNode("i", { class: "bi bi-pencil" }, null, -1)])], 8, _hoisted_51)])
59010
59238
  ]);
59011
59239
  }), 128))])])])])], 512), [[vShow, activeTab.value === "structure"]]),
59012
- withDirectives(createBaseVNode("div", _hoisted_54, [createBaseVNode("div", _hoisted_55, [createBaseVNode("div", _hoisted_56, [createBaseVNode("table", _hoisted_57, [createBaseVNode("thead", _hoisted_58, [createBaseVNode("tr", null, [
59240
+ withDirectives(createBaseVNode("div", _hoisted_52, [createBaseVNode("div", _hoisted_53, [createBaseVNode("div", _hoisted_54, [createBaseVNode("table", _hoisted_55, [createBaseVNode("thead", _hoisted_56, [createBaseVNode("tr", null, [
59013
59241
  createBaseVNode("th", null, toDisplayString(_ctx.$t("tableDetail.indexNameHeader")), 1),
59014
59242
  createBaseVNode("th", null, toDisplayString(_ctx.$t("tableDetail.typeHeader")), 1),
59015
59243
  createBaseVNode("th", null, toDisplayString(_ctx.$t("tableDetail.uniqueHeader")), 1),
59016
59244
  createBaseVNode("th", null, toDisplayString(_ctx.$t("tableDetail.columnsHeader")), 1),
59017
- createBaseVNode("th", _hoisted_59, toDisplayString(_ctx.$t("tableDetail.operationsHeader")), 1)
59245
+ createBaseVNode("th", _hoisted_57, toDisplayString(_ctx.$t("tableDetail.operationsHeader")), 1)
59018
59246
  ])]), createBaseVNode("tbody", null, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.tableStructure?.indexes || [], (index) => {
59019
59247
  return openBlock(), createElementBlock("tr", { key: index.name }, [
59020
59248
  createBaseVNode("td", null, [createBaseVNode("strong", null, toDisplayString(index.name), 1)]),
59021
- createBaseVNode("td", null, [createBaseVNode("span", _hoisted_60, toDisplayString(index.type), 1)]),
59249
+ createBaseVNode("td", null, [createBaseVNode("span", _hoisted_58, toDisplayString(index.type), 1)]),
59022
59250
  createBaseVNode("td", null, [createBaseVNode("span", { class: normalizeClass(index.unique ? "text-success" : "text-secondary") }, [createBaseVNode("i", { class: normalizeClass(index.unique ? "bi bi-check-circle-fill" : "bi bi-circle") }, null, 2), createTextVNode(" " + toDisplayString(index.unique ? _ctx.$t("common.yes") : _ctx.$t("common.no")), 1)], 2)]),
59023
59251
  createBaseVNode("td", null, [createBaseVNode("code", null, toDisplayString(index.columns.join(", ")), 1)]),
59024
- createBaseVNode("td", null, [createBaseVNode("div", _hoisted_61, [createBaseVNode("button", {
59252
+ createBaseVNode("td", null, [createBaseVNode("div", _hoisted_59, [createBaseVNode("button", {
59025
59253
  class: "btn btn-outline-primary btn-sm",
59026
59254
  onClick: ($event) => editIndex(index)
59027
- }, [..._cache[41] || (_cache[41] = [createBaseVNode("i", { class: "bi bi-pencil" }, null, -1)])], 8, _hoisted_62), createBaseVNode("button", {
59255
+ }, [..._cache[40] || (_cache[40] = [createBaseVNode("i", { class: "bi bi-pencil" }, null, -1)])], 8, _hoisted_60), createBaseVNode("button", {
59028
59256
  class: "btn btn-outline-danger btn-sm",
59029
59257
  onClick: ($event) => deleteIndex(index)
59030
- }, [..._cache[42] || (_cache[42] = [createBaseVNode("i", { class: "bi bi-trash" }, null, -1)])], 8, _hoisted_63)])])
59258
+ }, [..._cache[41] || (_cache[41] = [createBaseVNode("i", { class: "bi bi-trash" }, null, -1)])], 8, _hoisted_61)])])
59031
59259
  ]);
59032
59260
  }), 128))])])])])], 512), [[vShow, activeTab.value === "indexes"]]),
59033
- withDirectives(createBaseVNode("div", _hoisted_64, [createBaseVNode("div", _hoisted_65, [createBaseVNode("div", _hoisted_66, [createBaseVNode("table", _hoisted_67, [createBaseVNode("thead", _hoisted_68, [createBaseVNode("tr", null, [
59261
+ withDirectives(createBaseVNode("div", _hoisted_62, [createBaseVNode("div", _hoisted_63, [createBaseVNode("div", _hoisted_64, [createBaseVNode("table", _hoisted_65, [createBaseVNode("thead", _hoisted_66, [createBaseVNode("tr", null, [
59034
59262
  createBaseVNode("th", null, toDisplayString(_ctx.$t("tableDetail.constraintNameHeader")), 1),
59035
59263
  createBaseVNode("th", null, toDisplayString(_ctx.$t("tableDetail.localColumnHeader")), 1),
59036
59264
  createBaseVNode("th", null, toDisplayString(_ctx.$t("tableDetail.targetTableHeader")), 1),
59037
59265
  createBaseVNode("th", null, toDisplayString(_ctx.$t("tableDetail.targetColumnHeader")), 1),
59038
59266
  createBaseVNode("th", null, toDisplayString(_ctx.$t("tableDetail.onDeleteHeader")), 1),
59039
59267
  createBaseVNode("th", null, toDisplayString(_ctx.$t("tableDetail.onUpdateHeader")), 1),
59040
- createBaseVNode("th", _hoisted_69, toDisplayString(_ctx.$t("tableDetail.operationsHeader")), 1)
59268
+ createBaseVNode("th", _hoisted_67, toDisplayString(_ctx.$t("tableDetail.operationsHeader")), 1)
59041
59269
  ])]), createBaseVNode("tbody", null, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.tableStructure?.foreignKeys || [], (fk) => {
59042
59270
  return openBlock(), createElementBlock("tr", { key: fk.name }, [
59043
59271
  createBaseVNode("td", null, [createBaseVNode("strong", null, toDisplayString(fk.name), 1)]),
@@ -59046,13 +59274,13 @@ var init_table_detail_vue_vue_type_script_setup_true_lang = __esmMin((() => {
59046
59274
  createBaseVNode("td", null, [createBaseVNode("code", null, toDisplayString(fk.referencedColumn), 1)]),
59047
59275
  createBaseVNode("td", null, toDisplayString(fk.onDelete || "-"), 1),
59048
59276
  createBaseVNode("td", null, toDisplayString(fk.onUpdate || "-"), 1),
59049
- createBaseVNode("td", null, [createBaseVNode("div", _hoisted_70, [createBaseVNode("button", {
59277
+ createBaseVNode("td", null, [createBaseVNode("div", _hoisted_68, [createBaseVNode("button", {
59050
59278
  class: "btn btn-outline-danger btn-sm",
59051
59279
  onClick: ($event) => deleteForeignKey(fk)
59052
- }, [..._cache[43] || (_cache[43] = [createBaseVNode("i", { class: "bi bi-trash" }, null, -1)])], 8, _hoisted_71)])])
59280
+ }, [..._cache[42] || (_cache[42] = [createBaseVNode("i", { class: "bi bi-trash" }, null, -1)])], 8, _hoisted_69)])])
59053
59281
  ]);
59054
59282
  }), 128))])])])])], 512), [[vShow, activeTab.value === "relations"]]),
59055
- withDirectives(createBaseVNode("div", _hoisted_72, [createBaseVNode("div", _hoisted_73, [createVNode(sql_executor_default, {
59283
+ withDirectives(createBaseVNode("div", _hoisted_70, [createBaseVNode("div", _hoisted_71, [createVNode(sql_executor_default, {
59056
59284
  connection: __props.connection,
59057
59285
  database: __props.database
59058
59286
  }, null, 8, ["connection", "database"])])], 512), [[vShow, activeTab.value === "sql"]])
@@ -59099,21 +59327,40 @@ var init_table_detail_vue_vue_type_script_setup_true_lang = __esmMin((() => {
59099
59327
  });
59100
59328
  }));
59101
59329
  //#endregion
59102
- //#region src/platform/database/components/table-detail.vue?vue&type=style&index=0&scoped=15c7e3be&lang.css
59103
- var init_table_detail_vue_vue_type_style_index_0_scoped_15c7e3be_lang = __esmMin((() => {}));
59330
+ //#region src/platform/database/components/table-detail.vue?vue&type=style&index=0&scoped=aefb7a86&lang.css
59331
+ var init_table_detail_vue_vue_type_style_index_0_scoped_aefb7a86_lang = __esmMin((() => {}));
59104
59332
  //#endregion
59105
59333
  //#region src/platform/database/components/table-detail.vue
59106
59334
  var table_detail_default;
59107
59335
  var init_table_detail = __esmMin((() => {
59108
59336
  init_table_detail_vue_vue_type_script_setup_true_lang();
59109
59337
  init_table_detail_vue_vue_type_script_setup_true_lang();
59110
- init_table_detail_vue_vue_type_style_index_0_scoped_15c7e3be_lang();
59338
+ init_table_detail_vue_vue_type_style_index_0_scoped_aefb7a86_lang();
59111
59339
  init__plugin_vue_export_helper();
59112
- table_detail_default = /*#__PURE__*/ _plugin_vue_export_helper_default(table_detail_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-15c7e3be"]]);
59340
+ table_detail_default = /*#__PURE__*/ _plugin_vue_export_helper_default(table_detail_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-aefb7a86"]]);
59113
59341
  }));
59114
59342
  //#endregion
59343
+ //#region src/platform/database/utils/table.ts
59344
+ /**
59345
+ * 表元数据的通用判定(TableEntity 的跨方言差异集中在这里)。
59346
+ *
59347
+ * 各数据库方言 getTables 写入的 `type` 值并不统一:
59348
+ * - MySQL 的 information_schema.TABLES 给 'BASE TABLE' / 'VIEW'
59349
+ * - 其它方言可能写小写 'view',也可能完全不填 type
59350
+ * 因此统一按「包含 VIEW」判定;缺省(无 type)按普通表处理。
59351
+ */
59352
+ /** 是否视图。 */
59353
+ function isViewTable(table) {
59354
+ return String(table?.type || "").toUpperCase().includes("VIEW");
59355
+ }
59356
+ /** 从混合列表(表 + 视图)中筛出普通表。 */
59357
+ function pickTables(list) {
59358
+ return (list || []).filter((t) => !isViewTable(t));
59359
+ }
59360
+ var init_table = __esmMin((() => {}));
59361
+ //#endregion
59115
59362
  //#region src/platform/database/explorer.vue?vue&type=script&setup=true&lang.ts
59116
- var _hoisted_1, _hoisted_2, _hoisted_3, _hoisted_4, _hoisted_5, _hoisted_6, _hoisted_7, _hoisted_8, _hoisted_9, _hoisted_10, _hoisted_11, _hoisted_12, _hoisted_13, _hoisted_14, _hoisted_15, _hoisted_16, _hoisted_17, _hoisted_18, _hoisted_19, _hoisted_20, _hoisted_21, _hoisted_22, _hoisted_23, _hoisted_24, _hoisted_25, _hoisted_26, _hoisted_27, _hoisted_28, _hoisted_29, _hoisted_30, _hoisted_31, _hoisted_32, _hoisted_33, _hoisted_34, _hoisted_35, _hoisted_36, _hoisted_37, _hoisted_38, _hoisted_39, _hoisted_40, _hoisted_41, _hoisted_42, _hoisted_43, _hoisted_44, _hoisted_45, _hoisted_46, _hoisted_47, explorer_vue_vue_type_script_setup_true_lang_default;
59363
+ var _hoisted_1, _hoisted_2, _hoisted_3, _hoisted_4, _hoisted_5, _hoisted_6, _hoisted_7, _hoisted_8, _hoisted_9, _hoisted_10, _hoisted_11, _hoisted_12, _hoisted_13, _hoisted_14, _hoisted_15, _hoisted_16, _hoisted_17, _hoisted_18, _hoisted_19, _hoisted_20, _hoisted_21, _hoisted_22, _hoisted_23, _hoisted_24, _hoisted_25, _hoisted_26, _hoisted_27, _hoisted_28, _hoisted_29, _hoisted_30, _hoisted_31, _hoisted_32, _hoisted_33, _hoisted_34, _hoisted_35, _hoisted_36, _hoisted_37, _hoisted_38, _hoisted_39, _hoisted_40, _hoisted_41, _hoisted_42, _hoisted_43, _hoisted_44, _hoisted_45, _hoisted_46, explorer_vue_vue_type_script_setup_true_lang_default;
59117
59364
  var init_explorer_vue_vue_type_script_setup_true_lang = __esmMin((() => {
59118
59365
  init_vue_runtime_esm_bundler();
59119
59366
  init_vue_router();
@@ -59124,6 +59371,7 @@ var init_explorer_vue_vue_type_script_setup_true_lang = __esmMin((() => {
59124
59371
  init_connection_detail();
59125
59372
  init_database_detail();
59126
59373
  init_table_detail();
59374
+ init_table();
59127
59375
  init_modal();
59128
59376
  _hoisted_1 = { class: "database-explorer" };
59129
59377
  _hoisted_2 = { class: "explorer-layout" };
@@ -59181,18 +59429,17 @@ var init_explorer_vue_vue_type_script_setup_true_lang = __esmMin((() => {
59181
59429
  };
59182
59430
  _hoisted_40 = { class: "node-actions" };
59183
59431
  _hoisted_41 = ["onClick", "title"];
59184
- _hoisted_42 = ["onClick", "title"];
59185
- _hoisted_43 = {
59432
+ _hoisted_42 = {
59186
59433
  key: 0,
59187
59434
  class: "empty-state"
59188
59435
  };
59189
- _hoisted_44 = { class: "empty-text" };
59190
- _hoisted_45 = { class: "explorer-main" };
59191
- _hoisted_46 = {
59436
+ _hoisted_43 = { class: "empty-text" };
59437
+ _hoisted_44 = { class: "explorer-main" };
59438
+ _hoisted_45 = {
59192
59439
  key: 3,
59193
59440
  class: "default-state"
59194
59441
  };
59195
- _hoisted_47 = { class: "default-content" };
59442
+ _hoisted_46 = { class: "default-content" };
59196
59443
  explorer_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
59197
59444
  __name: "explorer",
59198
59445
  setup(__props) {
@@ -59212,6 +59459,7 @@ var init_explorer_vue_vue_type_script_setup_true_lang = __esmMin((() => {
59212
59459
  const databaseCache = ref(/* @__PURE__ */ new Map());
59213
59460
  const tableCache = ref(/* @__PURE__ */ new Map());
59214
59461
  const databaseInfoCache = ref(/* @__PURE__ */ new Map());
59462
+ const inflightTables = /* @__PURE__ */ new Map();
59215
59463
  const activeTab = ref("overview");
59216
59464
  const activeTableTab = ref("data");
59217
59465
  const tableData = ref([]);
@@ -59261,20 +59509,17 @@ var init_explorer_vue_vue_type_script_setup_true_lang = __esmMin((() => {
59261
59509
  expandedConnections.value.add(connectionId);
59262
59510
  loadDatabasesForConnection(connection);
59263
59511
  }
59264
- if (database) setTimeout(() => {
59512
+ if (database) setTimeout(async () => {
59265
59513
  selectedDatabase.value = database;
59266
59514
  selectedTable.value = null;
59267
59515
  activeTab.value = "tables";
59268
59516
  const dbKey = `${connectionId}-${database}`;
59269
59517
  expandedDatabases.value.add(dbKey);
59270
59518
  loadDatabaseInfo(connection, database);
59271
- loadTablesForDatabase(connection, database, true);
59272
- if (tableName) loadTablesForDatabase(connection, database, true).then(() => {
59273
- const t = (tableCache.value.get(dbKey) || []).find((x) => x.name === tableName);
59274
- if (t) selectTable(connection, database, t);
59275
- isUpdatingFromUrl = false;
59276
- });
59277
- else isUpdatingFromUrl = false;
59519
+ await loadTablesForDatabase(connection, database, true);
59520
+ const t = tableName ? getTablesForDatabase(connectionId, database).find((x) => x.name === tableName) : void 0;
59521
+ if (t) selectTable(connection, database, t);
59522
+ isUpdatingFromUrl = false;
59278
59523
  }, 100);
59279
59524
  else isUpdatingFromUrl = false;
59280
59525
  }
@@ -59315,6 +59560,7 @@ var init_explorer_vue_vue_type_script_setup_true_lang = __esmMin((() => {
59315
59560
  }
59316
59561
  }
59317
59562
  async function loadDatabasesForConnection(connection, forceRefresh = false) {
59563
+ if (connection._isProxy) return;
59318
59564
  const cacheKey = connection.id || "";
59319
59565
  if (!forceRefresh && databaseCache.value.has(cacheKey)) return;
59320
59566
  if (!loadingConnections.value.has(cacheKey)) loadingConnections.value.add(cacheKey);
@@ -59363,27 +59609,33 @@ var init_explorer_vue_vue_type_script_setup_true_lang = __esmMin((() => {
59363
59609
  }
59364
59610
  async function loadTablesForDatabase(connection, database, forceRefresh = false) {
59365
59611
  const dbKey = `${connection.id}-${database}`;
59366
- if (loadingTables.value.has(dbKey)) return;
59612
+ const inflight = inflightTables.get(dbKey);
59613
+ if (inflight) return inflight;
59367
59614
  if (!forceRefresh && tableCache.value.has(dbKey)) return;
59368
59615
  loadingTables.value.add(dbKey);
59369
- try {
59370
- const tables = (await databaseService.getDatabaseInfo(connection.id, database))?.data?.tables || [];
59371
- const newCache = new Map(tableCache.value);
59372
- newCache.set(dbKey, tables);
59373
- tableCache.value = newCache;
59374
- } catch (error) {
59375
- console.error("加载表失败:", error);
59376
- modal.error(error.msg || error.message || "加载表失败", {
59377
- operation: "LOAD_TABLES",
59378
- database,
59379
- stack: error.stack
59380
- });
59381
- const newCache = new Map(tableCache.value);
59382
- newCache.set(dbKey, []);
59383
- tableCache.value = newCache;
59384
- } finally {
59385
- loadingTables.value.delete(dbKey);
59386
- }
59616
+ const task = (async () => {
59617
+ try {
59618
+ const tables = (await databaseService.getDatabaseInfo(connection.id, database))?.data?.tables || [];
59619
+ const newCache = new Map(tableCache.value);
59620
+ newCache.set(dbKey, tables);
59621
+ tableCache.value = newCache;
59622
+ } catch (error) {
59623
+ console.error("加载表失败:", error);
59624
+ modal.error(error.msg || error.message || "加载表失败", {
59625
+ operation: "LOAD_TABLES",
59626
+ database,
59627
+ stack: error.stack
59628
+ });
59629
+ const newCache = new Map(tableCache.value);
59630
+ newCache.set(dbKey, []);
59631
+ tableCache.value = newCache;
59632
+ } finally {
59633
+ loadingTables.value.delete(dbKey);
59634
+ inflightTables.delete(dbKey);
59635
+ }
59636
+ })();
59637
+ inflightTables.set(dbKey, task);
59638
+ return task;
59387
59639
  }
59388
59640
  async function loadDatabaseInfo(connection, database, forceRefresh = false) {
59389
59641
  const dbKey = `${connection.id}-${database}`;
@@ -59484,10 +59736,14 @@ var init_explorer_vue_vue_type_script_setup_true_lang = __esmMin((() => {
59484
59736
  function getDatabasesForConnection(connectionId) {
59485
59737
  return databaseCache.value.get(connectionId) || [];
59486
59738
  }
59739
+ /**
59740
+ * 左侧树只展示表:视图不进树——点开会被当成表进入表详情(视图没有主键/索引/外键,
59741
+ * 结构页也不适用),视图统一由数据库详情页的"视图"标签页承载(独立 getViews 接口)。
59742
+ */
59487
59743
  function getTablesForDatabase(connectionId, database) {
59488
59744
  if (!connectionId) return [];
59489
59745
  const dbKey = `${connectionId}-${database}`;
59490
- return tableCache.value.get(dbKey) || [];
59746
+ return pickTables(tableCache.value.get(dbKey) || []);
59491
59747
  }
59492
59748
  function editConnection(connection) {
59493
59749
  connectionEditorRef.value?.showEditModal(connection);
@@ -59529,12 +59785,6 @@ var init_explorer_vue_vue_type_script_setup_true_lang = __esmMin((() => {
59529
59785
  function handleOpenSqlQuery(connection) {
59530
59786
  showToast("提示", "SQL查询功能开发中...", "info");
59531
59787
  }
59532
- function handleExportSchema(connection) {
59533
- showToast("提示", "架构导出功能开发中...", "info");
59534
- }
59535
- function handleViewLogs(connection) {
59536
- showToast("提示", "日志查看功能开发中...", "info");
59537
- }
59538
59788
  function refreshAll() {
59539
59789
  databaseCache.value.clear();
59540
59790
  tableCache.value.clear();
@@ -59550,17 +59800,14 @@ var init_explorer_vue_vue_type_script_setup_true_lang = __esmMin((() => {
59550
59800
  showToast("", "表结构已刷新", "success");
59551
59801
  }
59552
59802
  }
59553
- function viewTableStructure(connection, database, table) {
59554
- selectTable(connection, database, table);
59555
- activeTableTab.value = "structure";
59556
- }
59557
59803
  function getDbTypeLabel(type) {
59558
59804
  return {
59559
59805
  mysql: "MySQL",
59560
59806
  postgres: "PostgreSQL",
59561
59807
  sqlite: "SQLite",
59562
59808
  mssql: "SQL Server",
59563
- oracle: "Oracle"
59809
+ oracle: "Oracle",
59810
+ remote: "远程代理服务"
59564
59811
  }[type] || type;
59565
59812
  }
59566
59813
  function getDbLogoClass(type) {
@@ -59578,7 +59825,8 @@ var init_explorer_vue_vue_type_script_setup_true_lang = __esmMin((() => {
59578
59825
  postgres: "P",
59579
59826
  sqlite: "S",
59580
59827
  mssql: "MS",
59581
- oracle: "O"
59828
+ oracle: "O",
59829
+ remote: "R"
59582
59830
  }[type] || "D";
59583
59831
  }
59584
59832
  function formatNumber(num) {
@@ -59856,7 +60104,7 @@ var init_explorer_vue_vue_type_script_setup_true_lang = __esmMin((() => {
59856
60104
  key: `${connection.id}-${database}-${table.name}`,
59857
60105
  class: normalizeClass(["tree-node table-node", { "selected": selectedTable.value?.name === table.name && selectedDatabase.value === database && selectedConnection.value?.id === connection.id }])
59858
60106
  }, [createBaseVNode("div", _hoisted_35, [
59859
- _cache[14] || (_cache[14] = createBaseVNode("div", { class: "node-icon" }, [createBaseVNode("i", { class: "bi bi-table" })], -1)),
60107
+ _cache[13] || (_cache[13] = createBaseVNode("div", { class: "node-icon" }, [createBaseVNode("i", { class: "bi bi-table" })], -1)),
59860
60108
  createBaseVNode("div", {
59861
60109
  class: "node-main",
59862
60110
  onClick: ($event) => selectTable(connection, database, table)
@@ -59865,26 +60113,20 @@ var init_explorer_vue_vue_type_script_setup_true_lang = __esmMin((() => {
59865
60113
  class: "btn btn-sm btn-icon",
59866
60114
  onClick: withModifiers(($event) => refreshTable(connection, database, table), ["stop"]),
59867
60115
  title: _ctx.$t("explorer.refreshTable")
59868
- }, [..._cache[12] || (_cache[12] = [createBaseVNode("i", { class: "bi bi-arrow-clockwise" }, null, -1)])], 8, _hoisted_41), createBaseVNode("button", {
59869
- class: "btn btn-sm btn-icon",
59870
- onClick: withModifiers(($event) => viewTableStructure(connection, database, table), ["stop"]),
59871
- title: _ctx.$t("explorer.viewStructure")
59872
- }, [..._cache[13] || (_cache[13] = [createBaseVNode("i", { class: "bi bi-diagram-3" }, null, -1)])], 8, _hoisted_42)])
60116
+ }, [..._cache[12] || (_cache[12] = [createBaseVNode("i", { class: "bi bi-arrow-clockwise" }, null, -1)])], 8, _hoisted_41)])
59873
60117
  ])], 2);
59874
60118
  }), 128))])) : createCommentVNode("", true)], 2);
59875
60119
  }), 128))])) : createCommentVNode("", true)], 2);
59876
- }), 128))]), connections.value.length === 0 ? (openBlock(), createElementBlock("div", _hoisted_43, [_cache[16] || (_cache[16] = createBaseVNode("div", { class: "empty-icon" }, [createBaseVNode("i", { class: "bi bi-inbox" })], -1)), createBaseVNode("div", _hoisted_44, [createBaseVNode("p", null, toDisplayString(_ctx.$t("connection.noConnectionYet")), 1), createBaseVNode("button", {
60120
+ }), 128))]), connections.value.length === 0 ? (openBlock(), createElementBlock("div", _hoisted_42, [_cache[15] || (_cache[15] = createBaseVNode("div", { class: "empty-icon" }, [createBaseVNode("i", { class: "bi bi-inbox" })], -1)), createBaseVNode("div", _hoisted_43, [createBaseVNode("p", null, toDisplayString(_ctx.$t("connection.noConnectionYet")), 1), createBaseVNode("button", {
59877
60121
  class: "btn btn-primary btn-sm",
59878
60122
  onClick: showAddConnectionModal
59879
- }, [_cache[15] || (_cache[15] = createBaseVNode("i", { class: "bi bi-plus" }, null, -1)), createTextVNode(" " + toDisplayString(_ctx.$t("explorer.addConnection")), 1)])])])) : createCommentVNode("", true)])]), createBaseVNode("div", _hoisted_45, [selectedConnection.value && !selectedDatabase.value && !selectedTable.value ? (openBlock(), createBlock(connection_detail_default, {
60123
+ }, [_cache[14] || (_cache[14] = createBaseVNode("i", { class: "bi bi-plus" }, null, -1)), createTextVNode(" " + toDisplayString(_ctx.$t("explorer.addConnection")), 1)])])])) : createCommentVNode("", true)])]), createBaseVNode("div", _hoisted_44, [selectedConnection.value && !selectedDatabase.value && !selectedTable.value ? (openBlock(), createBlock(connection_detail_default, {
59880
60124
  key: 0,
59881
60125
  connection: selectedConnection.value,
59882
60126
  onTestConnection: handleTestConnection,
59883
60127
  onEditConnection: handleEditConnection,
59884
60128
  onRefreshAll: handleRefreshAll,
59885
60129
  onOpenSqlQuery: handleOpenSqlQuery,
59886
- onExportSchema: handleExportSchema,
59887
- onViewLogs: handleViewLogs,
59888
60130
  onCreateDatabase: handleCreateDatabase
59889
60131
  }, null, 8, ["connection"])) : selectedConnection.value && selectedDatabase.value && !selectedTable.value ? (openBlock(), createBlock(database_detail_default, {
59890
60132
  key: 1,
@@ -59936,8 +60178,8 @@ var init_explorer_vue_vue_type_script_setup_true_lang = __esmMin((() => {
59936
60178
  "total",
59937
60179
  "sql-result",
59938
60180
  "sql-executing"
59939
- ])) : (openBlock(), createElementBlock("div", _hoisted_46, [createBaseVNode("div", _hoisted_47, [
59940
- _cache[17] || (_cache[17] = createBaseVNode("div", { class: "default-icon" }, [createBaseVNode("i", { class: "bi bi-diagram-3" })], -1)),
60181
+ ])) : (openBlock(), createElementBlock("div", _hoisted_45, [createBaseVNode("div", _hoisted_46, [
60182
+ _cache[16] || (_cache[16] = createBaseVNode("div", { class: "default-icon" }, [createBaseVNode("i", { class: "bi bi-diagram-3" })], -1)),
59941
60183
  createBaseVNode("h5", null, toDisplayString(_ctx.$t("explorer.defaultTitle")), 1),
59942
60184
  createBaseVNode("p", null, toDisplayString(_ctx.$t("explorer.defaultDesc")), 1)
59943
60185
  ])]))])]),
@@ -59956,8 +60198,8 @@ var init_explorer_vue_vue_type_script_setup_true_lang = __esmMin((() => {
59956
60198
  });
59957
60199
  }));
59958
60200
  //#endregion
59959
- //#region src/platform/database/explorer.vue?vue&type=style&index=0&scoped=50189218&lang.css
59960
- var init_explorer_vue_vue_type_style_index_0_scoped_50189218_lang = __esmMin((() => {}));
60201
+ //#region src/platform/database/explorer.vue?vue&type=style&index=0&scoped=e2c2b105&lang.css
60202
+ var init_explorer_vue_vue_type_style_index_0_scoped_e2c2b105_lang = __esmMin((() => {}));
59961
60203
  //#endregion
59962
60204
  //#region src/platform/database/explorer.vue
59963
60205
  var explorer_default;
@@ -59965,8 +60207,8 @@ var explorer_default;
59965
60207
  __esmMin((() => {
59966
60208
  init_explorer_vue_vue_type_script_setup_true_lang();
59967
60209
  init_explorer_vue_vue_type_script_setup_true_lang();
59968
- init_explorer_vue_vue_type_style_index_0_scoped_50189218_lang();
60210
+ init_explorer_vue_vue_type_style_index_0_scoped_e2c2b105_lang();
59969
60211
  init__plugin_vue_export_helper();
59970
- explorer_default = /*#__PURE__*/ _plugin_vue_export_helper_default(explorer_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-50189218"]]);
60212
+ explorer_default = /*#__PURE__*/ _plugin_vue_export_helper_default(explorer_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-e2c2b105"]]);
59971
60213
  }))();
59972
60214
  export { explorer_default as default };