fdb2 1.0.33 → 1.0.34

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 (38) hide show
  1. package/dist/public/explorer.css +42 -42
  2. package/dist/public/explorer.js +35 -24
  3. package/dist/public/index.js +2 -0
  4. package/dist/public/layout.css +69 -54
  5. package/dist/public/layout.js +15 -8
  6. package/dist/server/core/db-api.js +5 -0
  7. package/dist/server/core/db-api.js.map +1 -1
  8. package/dist/server/core/db-api.ts +5 -0
  9. package/dist/server/core/dialect.d.ts +1 -1
  10. package/dist/server/core/dialect.d.ts.map +1 -1
  11. package/dist/server/core/dialect.js +21 -1
  12. package/dist/server/core/dialect.js.map +1 -1
  13. package/dist/server/core/dialect.ts +23 -2
  14. package/dist/server/service/connection.service.d.ts.map +1 -1
  15. package/dist/server/service/connection.service.js +17 -1
  16. package/dist/server/service/connection.service.js.map +1 -1
  17. package/dist/server/service/connection.service.ts +17 -1
  18. package/dist/server/service/database/clickhouse-connection.d.ts +44 -0
  19. package/dist/server/service/database/clickhouse-connection.d.ts.map +1 -0
  20. package/dist/server/service/database/clickhouse-connection.js +210 -0
  21. package/dist/server/service/database/clickhouse-connection.js.map +1 -0
  22. package/dist/server/service/database/clickhouse-connection.ts +182 -0
  23. package/dist/server/service/database/clickhouse.service.d.ts +138 -0
  24. package/dist/server/service/database/clickhouse.service.d.ts.map +1 -0
  25. package/dist/server/service/database/clickhouse.service.js +794 -0
  26. package/dist/server/service/database/clickhouse.service.js.map +1 -0
  27. package/dist/server/service/database/clickhouse.service.ts +853 -0
  28. package/dist/server/service/database/database.service.d.ts +42 -0
  29. package/dist/server/service/database/database.service.d.ts.map +1 -1
  30. package/dist/server/service/database/database.service.js +37 -0
  31. package/dist/server/service/database/database.service.js.map +1 -1
  32. package/dist/server/service/database/database.service.ts +37 -0
  33. package/dist/server/service/database/index.d.ts +1 -0
  34. package/dist/server/service/database/index.d.ts.map +1 -1
  35. package/dist/server/service/database/index.js +3 -1
  36. package/dist/server/service/database/index.js.map +1 -1
  37. package/dist/server/service/database/index.ts +1 -0
  38. package/package.json +1 -4
@@ -25,7 +25,7 @@
25
25
  }
26
26
 
27
27
  /* 顶部工具栏 */
28
- .top-toolbar[data-v-9b6e6db7] {
28
+ .top-toolbar[data-v-1b6d65cc] {
29
29
  display: flex;
30
30
  align-items: center;
31
31
  justify-content: space-between;
@@ -37,11 +37,11 @@
37
37
  top: 0;
38
38
  z-index: 1030;
39
39
  }
40
- .toolbar-left[data-v-9b6e6db7] {
40
+ .toolbar-left[data-v-1b6d65cc] {
41
41
  display: flex;
42
42
  align-items: center;
43
43
  }
44
- .brand-link[data-v-9b6e6db7] {
44
+ .brand-link[data-v-1b6d65cc] {
45
45
  display: flex;
46
46
  align-items: center;
47
47
  gap: 0.75rem;
@@ -49,10 +49,10 @@
49
49
  color: #1e293b;
50
50
  transition: all 0.3s ease;
51
51
  }
52
- .brand-link[data-v-9b6e6db7]:hover {
52
+ .brand-link[data-v-1b6d65cc]:hover {
53
53
  color: #667eea;
54
54
  }
55
- .brand-icon[data-v-9b6e6db7] {
55
+ .brand-icon[data-v-1b6d65cc] {
56
56
  width: 36px;
57
57
  height: 36px;
58
58
  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
@@ -63,19 +63,34 @@
63
63
  color: white;
64
64
  font-size: 1.2rem;
65
65
  }
66
- .brand-name[data-v-9b6e6db7] {
66
+ .brand-name[data-v-1b6d65cc] {
67
67
  font-size: 1.15rem;
68
68
  font-weight: 700;
69
69
  letter-spacing: -0.025em;
70
70
  }
71
- .toolbar-right[data-v-9b6e6db7] {
71
+ .toolbar-right[data-v-1b6d65cc] {
72
72
  display: flex;
73
73
  align-items: center;
74
74
  gap: 0.5rem;
75
75
  }
76
76
 
77
+ /* 版本号徽标 */
78
+ .app-version[data-v-1b6d65cc] {
79
+ font-size: 0.78rem;
80
+ font-weight: 600;
81
+ line-height: 1;
82
+ color: #64748b;
83
+ background: #f1f5f9;
84
+ border: 1px solid #e2e8f0;
85
+ padding: 0.28rem 0.6rem;
86
+ border-radius: 999px;
87
+ letter-spacing: 0.02em;
88
+ cursor: default;
89
+ user-select: none;
90
+ }
91
+
77
92
  /* 主布局样式 */
78
- .database-layout[data-v-9b6e6db7] {
93
+ .database-layout[data-v-1b6d65cc] {
79
94
  height: 100vh;
80
95
  display: flex;
81
96
  flex-direction: column;
@@ -83,7 +98,7 @@
83
98
  }
84
99
 
85
100
  /* 现代导航栏样式 */
86
- .navbar-modern[data-v-9b6e6db7] {
101
+ .navbar-modern[data-v-1b6d65cc] {
87
102
  background: linear-gradient(135deg, #ffffff 0%, #f8fafc 100%);
88
103
  border-bottom: 1px solid #cbd5e1;
89
104
  box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
@@ -95,10 +110,10 @@
95
110
  }
96
111
 
97
112
  /* 品牌区域 */
98
- .navbar-brand-wrapper[data-v-9b6e6db7] {
113
+ .navbar-brand-wrapper[data-v-1b6d65cc] {
99
114
  margin-right: 2rem;
100
115
  }
101
- .navbar-brand-modern[data-v-9b6e6db7] {
116
+ .navbar-brand-modern[data-v-1b6d65cc] {
102
117
  display: flex;
103
118
  align-items: center;
104
119
  gap: 1rem;
@@ -106,11 +121,11 @@
106
121
  color: #1e293b;
107
122
  transition: all 0.3s ease;
108
123
  }
109
- .navbar-brand-modern[data-v-9b6e6db7]:hover {
124
+ .navbar-brand-modern[data-v-1b6d65cc]:hover {
110
125
  color: #667eea;
111
126
  transform: translateX(2px);
112
127
  }
113
- .brand-icon[data-v-9b6e6db7] {
128
+ .brand-icon[data-v-1b6d65cc] {
114
129
  width: 45px;
115
130
  height: 45px;
116
131
  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
@@ -123,22 +138,22 @@
123
138
  box-shadow: 0 4px 12px rgba(102, 126, 234, 0.3);
124
139
  transition: all 0.3s ease;
125
140
  }
126
- .brand-icon[data-v-9b6e6db7]:hover {
141
+ .brand-icon[data-v-1b6d65cc]:hover {
127
142
  transform: rotate(5deg) scale(1.05);
128
143
  box-shadow: 0 6px 16px rgba(102, 126, 234, 0.4);
129
144
  }
130
- .brand-text[data-v-9b6e6db7] {
145
+ .brand-text[data-v-1b6d65cc] {
131
146
  display: flex;
132
147
  flex-direction: column;
133
148
  gap: 2px;
134
149
  }
135
- .brand-name[data-v-9b6e6db7] {
150
+ .brand-name[data-v-1b6d65cc] {
136
151
  font-size: 1.25rem;
137
152
  font-weight: 700;
138
153
  color: #1e293b;
139
154
  letter-spacing: -0.025em;
140
155
  }
141
- .brand-subtitle[data-v-9b6e6db7] {
156
+ .brand-subtitle[data-v-1b6d65cc] {
142
157
  font-size: 0.75rem;
143
158
  color: #334155;
144
159
  font-weight: 500;
@@ -147,7 +162,7 @@
147
162
  }
148
163
 
149
164
  /* 移动端切换按钮 */
150
- .navbar-toggler-modern[data-v-9b6e6db7] {
165
+ .navbar-toggler-modern[data-v-1b6d65cc] {
151
166
  background: none;
152
167
  border: none;
153
168
  padding: 0.5rem;
@@ -156,7 +171,7 @@
156
171
  flex-direction: column;
157
172
  gap: 4px;
158
173
  }
159
- .navbar-toggler-line[data-v-9b6e6db7] {
174
+ .navbar-toggler-line[data-v-1b6d65cc] {
160
175
  width: 25px;
161
176
  height: 3px;
162
177
  background: linear-gradient(90deg, #667eea, #764ba2);
@@ -165,20 +180,20 @@
165
180
  }
166
181
 
167
182
  /* 导航折叠区域 */
168
- .navbar-collapse-modern[data-v-9b6e6db7] {
183
+ .navbar-collapse-modern[data-v-1b6d65cc] {
169
184
  background: transparent;
170
185
  }
171
186
 
172
187
  /* 主导航样式 */
173
- .navbar-nav-modern[data-v-9b6e6db7] {
188
+ .navbar-nav-modern[data-v-1b6d65cc] {
174
189
  display: flex;
175
190
  align-items: center;
176
191
  gap: 0.5rem;
177
192
  }
178
- .nav-item-modern[data-v-9b6e6db7] {
193
+ .nav-item-modern[data-v-1b6d65cc] {
179
194
  position: relative;
180
195
  }
181
- .nav-link-modern[data-v-9b6e6db7] {
196
+ .nav-link-modern[data-v-1b6d65cc] {
182
197
  display: flex;
183
198
  align-items: center;
184
199
  gap: 0.75rem;
@@ -191,29 +206,29 @@
191
206
  position: relative;
192
207
  overflow: hidden;
193
208
  }
194
- .nav-link-modern[data-v-9b6e6db7]:hover {
209
+ .nav-link-modern[data-v-1b6d65cc]:hover {
195
210
  background: rgba(102, 126, 234, 0.1);
196
211
  color: #667eea;
197
212
  transform: translateY(-1px);
198
213
  }
199
- .nav-link-modern.active[data-v-9b6e6db7] {
214
+ .nav-link-modern.active[data-v-1b6d65cc] {
200
215
  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
201
216
  color: white;
202
217
  box-shadow: 0 4px 12px rgba(102, 126, 234, 0.3);
203
218
  }
204
- .nav-icon[data-v-9b6e6db7] {
219
+ .nav-icon[data-v-1b6d65cc] {
205
220
  font-size: 1.25rem;
206
221
  display: flex;
207
222
  align-items: center;
208
223
  justify-content: center;
209
224
  min-width: 24px;
210
225
  }
211
- .nav-text[data-v-9b6e6db7] {
226
+ .nav-text[data-v-1b6d65cc] {
212
227
  font-size: 0.95rem;
213
228
  font-weight: 600;
214
229
  letter-spacing: 0.025em;
215
230
  }
216
- .nav-indicator[data-v-9b6e6db7] {
231
+ .nav-indicator[data-v-1b6d65cc] {
217
232
  position: absolute;
218
233
  bottom: 0;
219
234
  left: 50%;
@@ -225,16 +240,16 @@
225
240
  opacity: 0;
226
241
  transition: all 0.3s ease;
227
242
  }
228
- .nav-link-modern.active .nav-indicator[data-v-9b6e6db7] {
243
+ .nav-link-modern.active .nav-indicator[data-v-1b6d65cc] {
229
244
  opacity: 1;
230
245
  }
231
246
 
232
247
  /* 用户菜单样式 */
233
- .nav-icon-only[data-v-9b6e6db7] {
248
+ .nav-icon-only[data-v-1b6d65cc] {
234
249
  padding: 0.75rem;
235
250
  min-width: auto;
236
251
  }
237
- .notification-dot[data-v-9b6e6db7] {
252
+ .notification-dot[data-v-1b6d65cc] {
238
253
  position: absolute;
239
254
  top: 8px;
240
255
  right: 8px;
@@ -243,9 +258,9 @@
243
258
  background: #ef4444;
244
259
  border-radius: 50%;
245
260
  border: 2px solid white;
246
- animation: pulse-9b6e6db7 2s ease-in-out infinite;
261
+ animation: pulse-1b6d65cc 2s ease-in-out infinite;
247
262
  }
248
- .user-menu-toggle[data-v-9b6e6db7] {
263
+ .user-menu-toggle[data-v-1b6d65cc] {
249
264
  display: flex;
250
265
  align-items: center;
251
266
  gap: 0.75rem;
@@ -253,10 +268,10 @@
253
268
  border-radius: 12px;
254
269
  transition: all 0.3s ease;
255
270
  }
256
- .user-menu-toggle[data-v-9b6e6db7]:hover {
271
+ .user-menu-toggle[data-v-1b6d65cc]:hover {
257
272
  background: rgba(102, 126, 234, 0.1);
258
273
  }
259
- .user-avatar[data-v-9b6e6db7] {
274
+ .user-avatar[data-v-1b6d65cc] {
260
275
  width: 40px;
261
276
  height: 40px;
262
277
  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
@@ -268,33 +283,33 @@
268
283
  font-size: 1.25rem;
269
284
  box-shadow: 0 2px 8px rgba(102, 126, 234, 0.3);
270
285
  }
271
- .user-info[data-v-9b6e6db7] {
286
+ .user-info[data-v-1b6d65cc] {
272
287
  display: flex;
273
288
  flex-direction: column;
274
289
  gap: 2px;
275
290
  }
276
- .user-name[data-v-9b6e6db7] {
291
+ .user-name[data-v-1b6d65cc] {
277
292
  font-size: 0.9rem;
278
293
  font-weight: 600;
279
294
  color: #1e293b;
280
295
  }
281
- .user-role[data-v-9b6e6db7] {
296
+ .user-role[data-v-1b6d65cc] {
282
297
  font-size: 0.75rem;
283
298
  color: #334155;
284
299
  font-weight: 500;
285
300
  }
286
- .dropdown-arrow[data-v-9b6e6db7] {
301
+ .dropdown-arrow[data-v-1b6d65cc] {
287
302
  color: #475569;
288
303
  font-size: 0.75rem;
289
304
  transition: all 0.3s ease;
290
305
  }
291
- .user-menu-toggle:hover .dropdown-arrow[data-v-9b6e6db7] {
306
+ .user-menu-toggle:hover .dropdown-arrow[data-v-1b6d65cc] {
292
307
  color: #667eea;
293
308
  transform: translateY(1px);
294
309
  }
295
310
 
296
311
  /* 现代下拉菜单样式 */
297
- .dropdown-menu-modern[data-v-9b6e6db7] {
312
+ .dropdown-menu-modern[data-v-1b6d65cc] {
298
313
  background: white;
299
314
  border: 1px solid #cbd5e1;
300
315
  border-radius: 16px;
@@ -304,7 +319,7 @@
304
319
  backdrop-filter: blur(10px);
305
320
  margin-top: 0.75rem;
306
321
  }
307
- .dropdown-header[data-v-9b6e6db7] {
322
+ .dropdown-header[data-v-1b6d65cc] {
308
323
  padding: 0.5rem 0.75rem;
309
324
  font-size: 0.75rem;
310
325
  font-weight: 700;
@@ -314,7 +329,7 @@
314
329
  border-bottom: 1px solid #f1f5f9;
315
330
  margin-bottom: 0.5rem;
316
331
  }
317
- .dropdown-item-modern[data-v-9b6e6db7] {
332
+ .dropdown-item-modern[data-v-1b6d65cc] {
318
333
  display: flex;
319
334
  align-items: center;
320
335
  gap: 0.75rem;
@@ -325,44 +340,44 @@
325
340
  transition: all 0.2s ease;
326
341
  margin-bottom: 2px;
327
342
  }
328
- .dropdown-item-modern[data-v-9b6e6db7]:hover {
343
+ .dropdown-item-modern[data-v-1b6d65cc]:hover {
329
344
  background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);
330
345
  color: #667eea;
331
346
  transform: translateX(4px);
332
347
  }
333
- .dropdown-item-modern.text-danger[data-v-9b6e6db7]:hover {
348
+ .dropdown-item-modern.text-danger[data-v-1b6d65cc]:hover {
334
349
  background: linear-gradient(135deg, #fef2f2 0%, #fee2e2 100%);
335
350
  color: #dc2626;
336
351
  }
337
- .dropdown-item-content[data-v-9b6e6db7] {
352
+ .dropdown-item-content[data-v-1b6d65cc] {
338
353
  display: flex;
339
354
  flex-direction: column;
340
355
  gap: 2px;
341
356
  }
342
- .dropdown-item-title[data-v-9b6e6db7] {
357
+ .dropdown-item-title[data-v-1b6d65cc] {
343
358
  font-size: 0.9rem;
344
359
  font-weight: 600;
345
360
  color: inherit;
346
361
  }
347
- .dropdown-item-desc[data-v-9b6e6db7] {
362
+ .dropdown-item-desc[data-v-1b6d65cc] {
348
363
  font-size: 0.75rem;
349
364
  color: #475569;
350
365
  }
351
- .dropdown-divider-modern[data-v-9b6e6db7] {
366
+ .dropdown-divider-modern[data-v-1b6d65cc] {
352
367
  margin: 0.75rem -0.75rem;
353
368
  border: none;
354
369
  border-top: 1px solid #e2e8f0;
355
370
  }
356
371
 
357
372
  /* 主要内容区域 */
358
- .main-content-modern[data-v-9b6e6db7] {
373
+ .main-content-modern[data-v-1b6d65cc] {
359
374
  flex: 1;
360
375
  display: flex;
361
376
  flex-direction: column;
362
377
  background: transparent;
363
378
  overflow: hidden;
364
379
  }
365
- .content-wrapper[data-v-9b6e6db7] {
380
+ .content-wrapper[data-v-1b6d65cc] {
366
381
  flex: 1;
367
382
  background: rgba(255, 255, 255, 0.3);
368
383
  backdrop-filter: blur(8px);
@@ -373,7 +388,7 @@
373
388
 
374
389
 
375
390
  /* 动画效果 */
376
- @keyframes pulse-9b6e6db7 {
391
+ @keyframes pulse-1b6d65cc {
377
392
  0%, 100% { opacity: 1; transform: scale(1);
378
393
  }
379
394
  50% { opacity: 0.6; transform: scale(1.2);
@@ -382,12 +397,12 @@
382
397
 
383
398
  /* 响应式设计 */
384
399
  @media (max-width: 768px) {
385
- .content-wrapper[data-v-9b6e6db7] {
400
+ .content-wrapper[data-v-1b6d65cc] {
386
401
  padding: 0.5rem;
387
402
  }
388
403
  }
389
404
  @media (max-width: 480px) {
390
- .content-wrapper[data-v-9b6e6db7] {
405
+ .content-wrapper[data-v-1b6d65cc] {
391
406
  padding: 0.25rem;
392
407
  }
393
408
  }
@@ -79,19 +79,23 @@ var init_language_switcher = __esmMin((() => {
79
79
  }));
80
80
  //#endregion
81
81
  //#region src/platform/database/layout.vue?vue&type=script&setup=true&lang.ts
82
- var _hoisted_1, _hoisted_2, _hoisted_3, _hoisted_4, _hoisted_5, _hoisted_6, layout_vue_vue_type_script_setup_true_lang_default;
82
+ var _hoisted_1, _hoisted_2, _hoisted_3, _hoisted_4, _hoisted_5, _hoisted_6, _hoisted_7, layout_vue_vue_type_script_setup_true_lang_default;
83
83
  var init_layout_vue_vue_type_script_setup_true_lang = __esmMin((() => {
84
84
  init_vue_runtime_esm_bundler();
85
+ init_vue_i18n();
85
86
  init_language_switcher();
86
87
  _hoisted_1 = { class: "database-layout" };
87
88
  _hoisted_2 = { class: "top-toolbar" };
88
89
  _hoisted_3 = { class: "toolbar-left" };
89
90
  _hoisted_4 = { class: "toolbar-right" };
90
- _hoisted_5 = { class: "main-content-modern" };
91
- _hoisted_6 = { class: "content-wrapper" };
91
+ _hoisted_5 = ["title"];
92
+ _hoisted_6 = { class: "main-content-modern" };
93
+ _hoisted_7 = { class: "content-wrapper" };
92
94
  layout_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
93
95
  __name: "layout",
94
96
  setup(__props) {
97
+ const { t } = useI18n();
98
+ const appVersion = "1.0.34";
95
99
  return (_ctx, _cache) => {
96
100
  const _component_router_link = resolveComponent("router-link");
97
101
  const _component_router_view = resolveComponent("router-view");
@@ -101,14 +105,17 @@ var init_layout_vue_vue_type_script_setup_true_lang = __esmMin((() => {
101
105
  }, {
102
106
  default: withCtx(() => [..._cache[0] || (_cache[0] = [createBaseVNode("div", { class: "brand-icon" }, [createBaseVNode("i", { class: "bi bi-database-gear" })], -1), createBaseVNode("span", { class: "brand-name" }, "fdb2", -1)])]),
103
107
  _: 1
104
- })]), createBaseVNode("div", _hoisted_4, [createVNode(language_switcher_default)])]), createBaseVNode("main", _hoisted_5, [createBaseVNode("div", _hoisted_6, [createVNode(_component_router_view)])])]);
108
+ })]), createBaseVNode("div", _hoisted_4, [createBaseVNode("span", {
109
+ class: "app-version",
110
+ title: unref(t)("app.version")
111
+ }, "v" + toDisplayString(unref(appVersion)), 9, _hoisted_5), createVNode(language_switcher_default)])]), createBaseVNode("main", _hoisted_6, [createBaseVNode("div", _hoisted_7, [createVNode(_component_router_view)])])]);
105
112
  };
106
113
  }
107
114
  });
108
115
  }));
109
116
  //#endregion
110
- //#region src/platform/database/layout.vue?vue&type=style&index=0&scoped=9b6e6db7&lang.css
111
- var init_layout_vue_vue_type_style_index_0_scoped_9b6e6db7_lang = __esmMin((() => {}));
117
+ //#region src/platform/database/layout.vue?vue&type=style&index=0&scoped=1b6d65cc&lang.css
118
+ var init_layout_vue_vue_type_style_index_0_scoped_1b6d65cc_lang = __esmMin((() => {}));
112
119
  //#endregion
113
120
  //#region src/platform/database/layout.vue
114
121
  var layout_default;
@@ -116,8 +123,8 @@ var layout_default;
116
123
  __esmMin((() => {
117
124
  init_layout_vue_vue_type_script_setup_true_lang();
118
125
  init_layout_vue_vue_type_script_setup_true_lang();
119
- init_layout_vue_vue_type_style_index_0_scoped_9b6e6db7_lang();
126
+ init_layout_vue_vue_type_style_index_0_scoped_1b6d65cc_lang();
120
127
  init__plugin_vue_export_helper();
121
- layout_default = /*#__PURE__*/ _plugin_vue_export_helper_default(layout_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-9b6e6db7"]]);
128
+ layout_default = /*#__PURE__*/ _plugin_vue_export_helper_default(layout_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-1b6d65cc"]]);
122
129
  }))();
123
130
  export { layout_default as default };
@@ -1103,6 +1103,11 @@ function formatDdlDefault(v) {
1103
1103
  }
1104
1104
  /** 列类型输出(用户 DSL 已含长度时原样大写;没有长度时按基础类型) */
1105
1105
  function typeFor(kind, c) {
1106
+ if (kind === 'clickhouse') {
1107
+ // ClickHouse 类型大小写不敏感,但惯用混合大小写(如 DateTime64、Nullable(String)),
1108
+ // 直接返回用户给定的类型,避免被强制大写为 DATETIME64
1109
+ return c.type;
1110
+ }
1106
1111
  return c.type.toUpperCase();
1107
1112
  }
1108
1113
  function getDataLogPath() {