fdb2 1.0.2 → 1.0.4

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 (94) hide show
  1. package/bin/fdb2.js +11 -3
  2. package/dist/public/.vite/manifest.json +82 -0
  3. package/dist/public/bootstrap-icons.woff +0 -0
  4. package/dist/public/bootstrap-icons.woff2 +0 -0
  5. package/dist/public/bootstrap.css +14152 -0
  6. package/dist/public/bootstrap.js +5038 -0
  7. package/dist/public/explorer.css +2137 -0
  8. package/dist/public/explorer.js +49846 -0
  9. package/dist/public/index.css +1071 -0
  10. package/dist/public/index.js +12811 -0
  11. package/dist/public/layout.css +318 -0
  12. package/dist/public/layout.js +25 -0
  13. package/dist/public/vue.css +1 -0
  14. package/dist/public/vue.js +9111 -0
  15. package/dist/server/index.d.ts +2 -0
  16. package/dist/server/index.d.ts.map +1 -0
  17. package/dist/server/index.js +598 -0
  18. package/dist/server/index.js.map +1 -0
  19. package/dist/server/index.ts +677 -0
  20. package/dist/server/model/connection.entity.d.ts +55 -0
  21. package/dist/server/model/connection.entity.d.ts.map +1 -0
  22. package/dist/server/model/connection.entity.js +59 -0
  23. package/dist/server/model/connection.entity.js.map +1 -0
  24. package/dist/server/model/connection.entity.ts +66 -0
  25. package/dist/server/model/database.entity.d.ts +203 -0
  26. package/dist/server/model/database.entity.d.ts.map +1 -0
  27. package/dist/server/model/database.entity.js +211 -0
  28. package/dist/server/model/database.entity.js.map +1 -0
  29. package/dist/server/model/database.entity.ts +246 -0
  30. package/dist/server/service/connection.service.d.ts +79 -0
  31. package/dist/server/service/connection.service.d.ts.map +1 -0
  32. package/dist/server/service/connection.service.js +351 -0
  33. package/dist/server/service/connection.service.js.map +1 -0
  34. package/dist/server/service/connection.service.ts +341 -0
  35. package/dist/server/service/database/base.service.d.ts +152 -0
  36. package/dist/server/service/database/base.service.d.ts.map +1 -0
  37. package/dist/server/service/database/base.service.js +236 -0
  38. package/dist/server/service/database/base.service.js.map +1 -0
  39. package/dist/server/service/database/base.service.ts +363 -0
  40. package/dist/server/service/database/cockroachdb.service.d.ts +95 -0
  41. package/dist/server/service/database/cockroachdb.service.d.ts.map +1 -0
  42. package/dist/server/service/database/cockroachdb.service.js +634 -0
  43. package/dist/server/service/database/cockroachdb.service.js.map +1 -0
  44. package/dist/server/service/database/cockroachdb.service.ts +659 -0
  45. package/dist/server/service/database/database.service.d.ts +487 -0
  46. package/dist/server/service/database/database.service.d.ts.map +1 -0
  47. package/dist/server/service/database/database.service.js +580 -0
  48. package/dist/server/service/database/database.service.js.map +1 -0
  49. package/dist/server/service/database/database.service.ts +630 -0
  50. package/dist/server/service/database/index.d.ts +8 -0
  51. package/dist/server/service/database/index.d.ts.map +1 -0
  52. package/dist/server/service/database/index.js +18 -0
  53. package/dist/server/service/database/index.js.map +1 -0
  54. package/dist/server/service/database/index.ts +7 -0
  55. package/dist/server/service/database/mongodb.service.d.ts +99 -0
  56. package/dist/server/service/database/mongodb.service.d.ts.map +1 -0
  57. package/dist/server/service/database/mongodb.service.js +459 -0
  58. package/dist/server/service/database/mongodb.service.js.map +1 -0
  59. package/dist/server/service/database/mongodb.service.ts +454 -0
  60. package/dist/server/service/database/mssql.service.d.ts +98 -0
  61. package/dist/server/service/database/mssql.service.d.ts.map +1 -0
  62. package/dist/server/service/database/mssql.service.js +694 -0
  63. package/dist/server/service/database/mssql.service.js.map +1 -0
  64. package/dist/server/service/database/mssql.service.ts +723 -0
  65. package/dist/server/service/database/mysql.service.d.ts +94 -0
  66. package/dist/server/service/database/mysql.service.d.ts.map +1 -0
  67. package/dist/server/service/database/mysql.service.js +735 -0
  68. package/dist/server/service/database/mysql.service.js.map +1 -0
  69. package/dist/server/service/database/mysql.service.ts +761 -0
  70. package/dist/server/service/database/oracle.service.d.ts +106 -0
  71. package/dist/server/service/database/oracle.service.d.ts.map +1 -0
  72. package/dist/server/service/database/oracle.service.js +787 -0
  73. package/dist/server/service/database/oracle.service.js.map +1 -0
  74. package/dist/server/service/database/oracle.service.ts +832 -0
  75. package/dist/server/service/database/postgres.service.d.ts +102 -0
  76. package/dist/server/service/database/postgres.service.d.ts.map +1 -0
  77. package/dist/server/service/database/postgres.service.js +696 -0
  78. package/dist/server/service/database/postgres.service.js.map +1 -0
  79. package/dist/server/service/database/postgres.service.ts +741 -0
  80. package/dist/server/service/database/sap.service.d.ts +95 -0
  81. package/dist/server/service/database/sap.service.d.ts.map +1 -0
  82. package/dist/server/service/database/sap.service.js +695 -0
  83. package/dist/server/service/database/sap.service.js.map +1 -0
  84. package/dist/server/service/database/sap.service.ts +713 -0
  85. package/dist/server/service/database/sqlite.service.d.ts +92 -0
  86. package/dist/server/service/database/sqlite.service.d.ts.map +1 -0
  87. package/dist/server/service/database/sqlite.service.js +532 -0
  88. package/dist/server/service/database/sqlite.service.js.map +1 -0
  89. package/dist/server/service/database/sqlite.service.ts +559 -0
  90. package/dist/server/service/session.service.ts +158 -0
  91. package/dist/view/index.html +45 -0
  92. package/package.json +2 -1
  93. package/scripts/preinstall.js +38 -0
  94. package/server.pid +0 -1
@@ -0,0 +1,2137 @@
1
+
2
+ /* 继承原有的样式,这里可以添加组件特定的样式 */
3
+ .connection-form-modern[data-v-093594aa] {
4
+ padding: 0;
5
+ }
6
+ .form-section[data-v-093594aa] {
7
+ margin-bottom: 2rem;
8
+ }
9
+ .section-header[data-v-093594aa] {
10
+ display: flex;
11
+ align-items: center;
12
+ margin-bottom: 1.5rem;
13
+ padding-bottom: 0.75rem;
14
+ border-bottom: 2px solid #f0f0f0;
15
+ }
16
+ .section-icon[data-v-093594aa] {
17
+ width: 40px;
18
+ height: 40px;
19
+ border-radius: 8px;
20
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
21
+ display: flex;
22
+ align-items: center;
23
+ justify-content: center;
24
+ color: white;
25
+ margin-right: 1rem;
26
+ }
27
+ .section-title[data-v-093594aa] {
28
+ font-size: 1.1rem;
29
+ font-weight: 600;
30
+ margin: 0;
31
+ color: #333;
32
+ }
33
+ .section-content[data-v-093594aa] {
34
+ padding-left: 56px;
35
+ }
36
+ .form-grid[data-v-093594aa] {
37
+ display: grid;
38
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
39
+ gap: 1.5rem;
40
+ }
41
+ .form-group-modern[data-v-093594aa] {
42
+ margin-bottom: 1rem;
43
+ }
44
+ .form-label-modern[data-v-093594aa] {
45
+ display: flex;
46
+ align-items: center;
47
+ font-weight: 500;
48
+ color: #555;
49
+ margin-bottom: 0.5rem;
50
+ font-size: 0.9rem;
51
+ }
52
+ .form-control-modern[data-v-093594aa],
53
+ .form-select-modern[data-v-093594aa] {
54
+ width: 100%;
55
+ padding: 0.75rem;
56
+ border: 2px solid #e9ecef;
57
+ border-radius: 8px;
58
+ font-size: 0.95rem;
59
+ transition: all 0.3s ease;
60
+ }
61
+ .form-control-modern[data-v-093594aa]:focus,
62
+ .form-select-modern[data-v-093594aa]:focus {
63
+ outline: none;
64
+ border-color: #667eea;
65
+ box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1);
66
+ }
67
+ .form-check-modern[data-v-093594aa] {
68
+ display: flex;
69
+ align-items: flex-start;
70
+ padding: 0;
71
+ }
72
+ .form-check-input-modern[data-v-093594aa] {
73
+ margin-right: 0.75rem;
74
+ margin-top: 0.25rem;
75
+ }
76
+ .form-check-label-modern[data-v-093594aa] {
77
+ display: flex;
78
+ flex-direction: column;
79
+ cursor: pointer;
80
+ }
81
+ .check-text[data-v-093594aa] {
82
+ font-weight: 500;
83
+ color: #333;
84
+ margin-bottom: 0.25rem;
85
+ }
86
+ .check-description[data-v-093594aa] {
87
+ font-size: 0.85rem;
88
+ color: #666;
89
+ }
90
+ .required[data-v-093594aa] {
91
+ color: #dc3545;
92
+ margin-left: 0.25rem;
93
+ }
94
+ .error-content[data-v-093594aa] {
95
+ display: flex;
96
+ align-items: center;
97
+ padding: 1.5rem;
98
+ gap: 1rem;
99
+ }
100
+ .error-icon[data-v-093594aa] {
101
+ width: 48px;
102
+ height: 48px;
103
+ border-radius: 50%;
104
+ background: linear-gradient(135deg, #dc3545 0%, #ff6b6b 100%);
105
+ display: flex;
106
+ align-items: center;
107
+ justify-content: center;
108
+ color: white;
109
+ font-size: 1.5rem;
110
+ flex-shrink: 0;
111
+ }
112
+ .error-message[data-v-093594aa] {
113
+ flex: 1;
114
+ color: #333;
115
+ font-size: 0.95rem;
116
+ line-height: 1.6;
117
+ }
118
+
119
+ .sql-executor[data-v-ac4aced1] {
120
+ width: 100%;
121
+ flex: 1;
122
+ display: flex;
123
+ flex-direction: column;
124
+ gap: 10px;
125
+ }
126
+ .sql-toolbar[data-v-ac4aced1] {
127
+ display: flex;
128
+ justify-content: space-between;
129
+ align-items: center;
130
+ margin-bottom: 10px;
131
+ padding: 10px;
132
+ background-color: #f8f9fa;
133
+ border-radius: 4px;
134
+ }
135
+ .toolbar-left[data-v-ac4aced1],
136
+ .toolbar-right[data-v-ac4aced1] {
137
+ display: flex;
138
+ gap: 8px;
139
+ }
140
+ .sql-container[data-v-ac4aced1] {
141
+ position: relative;
142
+ border: 1px solid #dee2e6;
143
+ border-radius: 4px;
144
+ overflow: hidden;
145
+ flex: 1;
146
+ display: flex;
147
+ flex-direction: column;
148
+ }
149
+ .sql-editor[data-v-ac4aced1] {
150
+ position: relative;
151
+ overflow: auto;
152
+ flex: 0 1 300px;
153
+ min-height: 200px;
154
+ }
155
+ .sql-result[data-v-ac4aced1] {
156
+ position: relative;
157
+ overflow: auto;
158
+ border-top: 1px solid #dee2e6;
159
+ flex: 1;
160
+ }
161
+ .codemirror-editor[data-v-ac4aced1] {
162
+ height: 100%;
163
+ width: 100%;
164
+ }
165
+ .resizer[data-v-ac4aced1] {
166
+ height: 8px;
167
+ background-color: #e9ecef;
168
+ cursor: ns-resize;
169
+ display: flex;
170
+ align-items: center;
171
+ justify-content: center;
172
+ }
173
+ .resizer[data-v-ac4aced1]:hover {
174
+ background-color: #dee2e6;
175
+ }
176
+ .resizer[data-v-ac4aced1]::before {
177
+ content: '';
178
+ width: 40px;
179
+ height: 2px;
180
+ background-color: #adb5bd;
181
+ border-radius: 1px;
182
+ }
183
+ .resizer.resizing[data-v-ac4aced1] {
184
+ background-color: #dee2e6;
185
+ }
186
+ .resizer.resizing[data-v-ac4aced1]::before {
187
+ background-color: #6c757d;
188
+ }
189
+ .sql-result[data-v-ac4aced1] {
190
+ position: relative;
191
+ overflow: auto;
192
+ border-top: 1px solid #dee2e6;
193
+ }
194
+ .result-content[data-v-ac4aced1] {
195
+ height: 100%;
196
+ display: flex;
197
+ flex-direction: column;
198
+ }
199
+ .result-header[data-v-ac4aced1] {
200
+ display: flex;
201
+ justify-content: space-between;
202
+ align-items: center;
203
+ padding: 12px;
204
+ background-color: #f8f9fa;
205
+ border-bottom: 1px solid #dee2e6;
206
+ }
207
+ .result-title[data-v-ac4aced1] {
208
+ margin: 0;
209
+ font-size: 14px;
210
+ font-weight: 600;
211
+ display: flex;
212
+ align-items: center;
213
+ gap: 8px;
214
+ }
215
+ .sql-loading[data-v-ac4aced1] {
216
+ display: flex;
217
+ align-items: center;
218
+ gap: 8px;
219
+ }
220
+ .result-stats[data-v-ac4aced1] {
221
+ display: flex;
222
+ gap: 8px;
223
+ }
224
+ .result-info[data-v-ac4aced1] {
225
+ display: flex;
226
+ justify-content: space-between;
227
+ align-items: center;
228
+ padding: 10px 12px;
229
+ background-color: #f8f9fa;
230
+ border-bottom: 1px solid #dee2e6;
231
+ }
232
+ .result-actions[data-v-ac4aced1] {
233
+ display: flex;
234
+ gap: 8px;
235
+ }
236
+ .result-table-container[data-v-ac4aced1] {
237
+ flex: 1;
238
+ overflow: auto;
239
+ }
240
+
241
+ /* 对象结果样式 */
242
+ .result-object[data-v-ac4aced1] {
243
+ display: flex;
244
+ flex-direction: column;
245
+ height: 100%;
246
+ }
247
+ .object-container[data-v-ac4aced1] {
248
+ flex: 1;
249
+ overflow: auto;
250
+ }
251
+ .object-container table[data-v-ac4aced1] {
252
+ width: 100%;
253
+ }
254
+ .object-container th[data-v-ac4aced1]:first-child {
255
+ width: 20%;
256
+ min-width: 100px;
257
+ }
258
+ .object-container td[data-v-ac4aced1]:first-child {
259
+ font-weight: 500;
260
+ background-color: #f8f9fa;
261
+ }
262
+ .sql-loading-state[data-v-ac4aced1] {
263
+ display: flex;
264
+ align-items: center;
265
+ justify-content: center;
266
+ height: 100%;
267
+ flex: 1;
268
+ }
269
+ .sql-empty-result[data-v-ac4aced1],
270
+ .sql-error[data-v-ac4aced1] {
271
+ padding: 12px;
272
+ flex: 1;
273
+ }
274
+ .result-empty[data-v-ac4aced1] {
275
+ display: flex;
276
+ flex-direction: column;
277
+ align-items: center;
278
+ justify-content: center;
279
+ height: 100%;
280
+ color: #6c757d;
281
+ gap: 10px;
282
+ }
283
+ .result-empty i[data-v-ac4aced1] {
284
+ font-size: 48px;
285
+ opacity: 0.5;
286
+ }
287
+ .json-result[data-v-ac4aced1] {
288
+ flex: 1;
289
+ overflow: hidden;
290
+ }
291
+ .json-result .codemirror-editor[data-v-ac4aced1] {
292
+ height: 100%;
293
+ width: 100%;
294
+ }
295
+
296
+ /* 响应式设计 */
297
+ @media (max-width: 768px) {
298
+ .sql-toolbar[data-v-ac4aced1] {
299
+ flex-direction: column;
300
+ align-items: stretch;
301
+ gap: 8px;
302
+ }
303
+ .toolbar-left[data-v-ac4aced1],
304
+ .toolbar-right[data-v-ac4aced1] {
305
+ justify-content: center;
306
+ }
307
+ }
308
+
309
+ .connection-detail[data-v-d46cb2d8] {
310
+ padding: 20px;
311
+ display: flex;
312
+ flex-direction: column;
313
+ height: 100%;
314
+ gap: 20px;
315
+ }
316
+ .connection-header[data-v-d46cb2d8] {
317
+ display: flex;
318
+ justify-content: space-between;
319
+ align-items: center;
320
+ margin-bottom: 20px;
321
+ padding: 20px;
322
+ background-color: #f8f9fa;
323
+ border-radius: 8px;
324
+ }
325
+ .connection-info[data-v-d46cb2d8] {
326
+ display: flex;
327
+ align-items: center;
328
+ gap: 16px;
329
+ }
330
+ .connection-avatar[data-v-d46cb2d8] {
331
+ width: 60px;
332
+ height: 60px;
333
+ display: flex;
334
+ align-items: center;
335
+ justify-content: center;
336
+ border-radius: 8px;
337
+ background-color: #e9ecef;
338
+ }
339
+ .db-logo[data-v-d46cb2d8] {
340
+ font-size: 24px;
341
+ font-weight: bold;
342
+ color: #6c757d;
343
+ }
344
+ .db-mysql[data-v-d46cb2d8] {
345
+ background-color: #4CAF50;
346
+ color: white;
347
+ }
348
+ .db-postgres[data-v-d46cb2d8] {
349
+ background-color: #336791;
350
+ color: white;
351
+ }
352
+ .db-mssql[data-v-d46cb2d8] {
353
+ background-color: #0078d4;
354
+ color: white;
355
+ }
356
+ .db-sqlite[data-v-d46cb2d8] {
357
+ background-color: #003B57;
358
+ color: white;
359
+ }
360
+ .db-oracle[data-v-d46cb2d8] {
361
+ background-color: #F80000;
362
+ color: white;
363
+ }
364
+ .connection-meta[data-v-d46cb2d8] {
365
+ display: flex;
366
+ flex-direction: column;
367
+ gap: 4px;
368
+ }
369
+ .connection-name[data-v-d46cb2d8] {
370
+ margin: 0;
371
+ font-size: 20px;
372
+ font-weight: 600;
373
+ }
374
+ .connection-type-info[data-v-d46cb2d8] {
375
+ display: flex;
376
+ align-items: center;
377
+ gap: 12px;
378
+ }
379
+ .db-type[data-v-d46cb2d8] {
380
+ padding: 4px 12px;
381
+ border-radius: 12px;
382
+ background-color: #e9ecef;
383
+ font-size: 12px;
384
+ font-weight: 500;
385
+ }
386
+ .connection-status[data-v-d46cb2d8] {
387
+ display: flex;
388
+ align-items: center;
389
+ gap: 6px;
390
+ font-size: 14px;
391
+ }
392
+ .status-dot[data-v-d46cb2d8] {
393
+ width: 8px;
394
+ height: 8px;
395
+ border-radius: 50%;
396
+ background-color: #6c757d;
397
+ }
398
+ .status-online .status-dot[data-v-d46cb2d8] {
399
+ background-color: #28a745;
400
+ }
401
+ .status-offline .status-dot[data-v-d46cb2d8] {
402
+ background-color: #dc3545;
403
+ }
404
+ .status-testing .status-dot[data-v-d46cb2d8] {
405
+ background-color: #ffc107;
406
+ animation: pulse-d46cb2d8 1s infinite;
407
+ }
408
+ @keyframes pulse-d46cb2d8 {
409
+ 0%, 100% {
410
+ opacity: 1;
411
+ }
412
+ 50% {
413
+ opacity: 0.5;
414
+ }
415
+ }
416
+ .connection-actions[data-v-d46cb2d8] {
417
+ display: flex;
418
+ gap: 8px;
419
+ }
420
+ .connection-details-panel[data-v-d46cb2d8] {
421
+ margin-bottom: 30px;
422
+ animation: fadeIn-d46cb2d8 0.3s ease;
423
+ }
424
+ .section-title[data-v-d46cb2d8] {
425
+ margin: 0 0 16px 0;
426
+ font-size: 16px;
427
+ font-weight: 600;
428
+ display: flex;
429
+ align-items: center;
430
+ gap: 8px;
431
+ color: #343a40;
432
+ padding-bottom: 8px;
433
+ border-bottom: 1px solid #e9ecef;
434
+ }
435
+ @keyframes fadeIn-d46cb2d8 {
436
+ from {
437
+ opacity: 0;
438
+ transform: translateY(-10px);
439
+ }
440
+ to {
441
+ opacity: 1;
442
+ transform: translateY(0);
443
+ }
444
+ }
445
+ .detail-card[data-v-d46cb2d8] {
446
+ border: 1px solid #dee2e6;
447
+ border-radius: 8px;
448
+ overflow: hidden;
449
+ }
450
+ .card-header[data-v-d46cb2d8] {
451
+ padding: 16px;
452
+ background-color: #f8f9fa;
453
+ border-bottom: 1px solid #dee2e6;
454
+ }
455
+ .card-title[data-v-d46cb2d8] {
456
+ margin: 0;
457
+ font-size: 16px;
458
+ font-weight: 600;
459
+ display: flex;
460
+ align-items: center;
461
+ gap: 8px;
462
+ }
463
+ .card-body[data-v-d46cb2d8] {
464
+ padding: 16px;
465
+ }
466
+ .info-grid[data-v-d46cb2d8] {
467
+ display: grid;
468
+ grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
469
+ gap: 16px;
470
+ margin-bottom: 10px;
471
+ }
472
+ .info-item[data-v-d46cb2d8] {
473
+ display: flex;
474
+ flex-direction: column;
475
+ gap: 4px;
476
+ padding: 10px;
477
+ background-color: #f8f9fa;
478
+ border-radius: 6px;
479
+ transition: all 0.2s ease;
480
+ }
481
+ .info-item[data-v-d46cb2d8]:hover {
482
+ background-color: #e9ecef;
483
+ transform: translateY(-1px);
484
+ }
485
+ .info-label[data-v-d46cb2d8] {
486
+ font-size: 12px;
487
+ font-weight: 500;
488
+ color: #6c757d;
489
+ text-transform: uppercase;
490
+ letter-spacing: 0.5px;
491
+ }
492
+ .info-value[data-v-d46cb2d8] {
493
+ font-size: 14px;
494
+ font-weight: 500;
495
+ color: #343a40;
496
+ }
497
+ .db-type-badge[data-v-d46cb2d8] {
498
+ padding: 4px 10px;
499
+ border-radius: 12px;
500
+ font-size: 12px;
501
+ font-weight: 500;
502
+ }
503
+ .stats-grid[data-v-d46cb2d8] {
504
+ display: grid;
505
+ grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
506
+ gap: 16px;
507
+ }
508
+ .stat-item[data-v-d46cb2d8] {
509
+ text-align: center;
510
+ padding: 12px;
511
+ background-color: #f8f9fa;
512
+ border-radius: 6px;
513
+ transition: all 0.2s ease;
514
+ }
515
+ .stat-item[data-v-d46cb2d8]:hover {
516
+ background-color: #e9ecef;
517
+ transform: translateY(-1px);
518
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
519
+ }
520
+ .stat-value[data-v-d46cb2d8] {
521
+ font-size: 20px;
522
+ font-weight: 600;
523
+ color: #343a40;
524
+ }
525
+ .stat-label[data-v-d46cb2d8] {
526
+ font-size: 12px;
527
+ color: #6c757d;
528
+ margin-top: 4px;
529
+ }
530
+ .quick-actions[data-v-d46cb2d8] {
531
+ margin-bottom: 30px;
532
+ padding: 20px;
533
+ background-color: #f8f9fa;
534
+ border-radius: 8px;
535
+ }
536
+ .actions-header[data-v-d46cb2d8] {
537
+ margin-bottom: 16px;
538
+ }
539
+ .actions-title[data-v-d46cb2d8] {
540
+ margin: 0;
541
+ font-size: 16px;
542
+ font-weight: 600;
543
+ display: flex;
544
+ align-items: center;
545
+ gap: 8px;
546
+ }
547
+ .actions-grid[data-v-d46cb2d8] {
548
+ display: grid;
549
+ grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
550
+ gap: 16px;
551
+ }
552
+ .action-btn[data-v-d46cb2d8] {
553
+ display: flex;
554
+ flex-direction: column;
555
+ align-items: center;
556
+ gap: 8px;
557
+ padding: 16px;
558
+ background-color: white;
559
+ border: 1px solid #dee2e6;
560
+ border-radius: 8px;
561
+ cursor: pointer;
562
+ transition: all 0.2s ease;
563
+ }
564
+ .action-btn[data-v-d46cb2d8]:hover {
565
+ background-color: #e9ecef;
566
+ transform: translateY(-2px);
567
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
568
+ }
569
+ .action-icon[data-v-d46cb2d8] {
570
+ font-size: 24px;
571
+ color: #6c757d;
572
+ }
573
+ .action-text[data-v-d46cb2d8] {
574
+ font-size: 14px;
575
+ font-weight: 500;
576
+ color: #343a40;
577
+ }
578
+ .connection-tabs[data-v-d46cb2d8] {
579
+ border: 1px solid #dee2e6;
580
+ border-radius: 8px;
581
+ overflow: hidden;
582
+ flex: 1;
583
+ display: flex;
584
+ flex-direction: column;
585
+ }
586
+ .nav-tabs[data-v-d46cb2d8] {
587
+ border-bottom: 1px solid #dee2e6;
588
+ background-color: #f8f9fa;
589
+ }
590
+ .nav-link[data-v-d46cb2d8] {
591
+ border: none;
592
+ border-radius: 0;
593
+ padding: 12px 20px;
594
+ font-size: 14px;
595
+ font-weight: 500;
596
+ transition: all 0.2s ease;
597
+ }
598
+ .nav-link[data-v-d46cb2d8]:hover {
599
+ background-color: #e9ecef;
600
+ }
601
+ .nav-link.active[data-v-d46cb2d8] {
602
+ background-color: white;
603
+ border-bottom: 2px solid #0d6efd;
604
+ }
605
+ .tab-content[data-v-d46cb2d8] {
606
+ flex: 1;
607
+ display: flex;
608
+ flex-direction: column;
609
+ overflow: hidden;
610
+ }
611
+ .tab-panel[data-v-d46cb2d8] {
612
+ padding: 20px;
613
+ flex: 1;
614
+ display: flex;
615
+ flex-direction: column;
616
+ overflow: hidden;
617
+ }
618
+ .databases-section[data-v-d46cb2d8] {
619
+ display: flex;
620
+ flex-direction: column;
621
+ gap: 16px;
622
+ flex: 1;
623
+ overflow: hidden;
624
+ }
625
+ .section-header[data-v-d46cb2d8] {
626
+ display: flex;
627
+ justify-content: flex-end;
628
+ align-items: center;
629
+ }
630
+ .section-actions[data-v-d46cb2d8] {
631
+ display: flex;
632
+ align-items: center;
633
+ gap: 8px;
634
+ }
635
+ .databases-list[data-v-d46cb2d8] {
636
+ min-height: 300px;
637
+ height: 100%;
638
+ overflow-y: auto;
639
+ padding-right: 8px;
640
+ }
641
+ .loading-state[data-v-d46cb2d8] {
642
+ display: flex;
643
+ flex-direction: column;
644
+ align-items: center;
645
+ justify-content: center;
646
+ padding: 60px 20px;
647
+ gap: 16px;
648
+ }
649
+ .empty-state[data-v-d46cb2d8] {
650
+ display: flex;
651
+ flex-direction: column;
652
+ align-items: center;
653
+ justify-content: center;
654
+ padding: 60px 20px;
655
+ gap: 16px;
656
+ text-align: center;
657
+ }
658
+ .empty-state i[data-v-d46cb2d8] {
659
+ font-size: 48px;
660
+ color: #ced4da;
661
+ }
662
+ .empty-state p[data-v-d46cb2d8] {
663
+ margin: 0;
664
+ color: #6c757d;
665
+ font-size: 16px;
666
+ }
667
+ .databases-list-simple[data-v-d46cb2d8] {
668
+ display: grid;
669
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
670
+ gap: 12px;
671
+ }
672
+ .database-item[data-v-d46cb2d8] {
673
+ display: flex;
674
+ flex-direction: column;
675
+ align-items: center;
676
+ gap: 8px;
677
+ padding: 16px;
678
+ border: 1px solid #dee2e6;
679
+ border-radius: 6px;
680
+ cursor: pointer;
681
+ transition: all 0.2s ease;
682
+ text-align: center;
683
+ min-height: 100px;
684
+ }
685
+ .database-item[data-v-d46cb2d8]:hover {
686
+ border-color: #0d6efd;
687
+ background-color: #f8f9fa;
688
+ transform: translateY(-2px);
689
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
690
+ }
691
+ .database-item-icon[data-v-d46cb2d8] {
692
+ font-size: 32px;
693
+ color: #6c757d;
694
+ }
695
+ .database-item-name[data-v-d46cb2d8] {
696
+ font-size: 14px;
697
+ font-weight: 500;
698
+ color: #343a40;
699
+ overflow: hidden;
700
+ text-overflow: ellipsis;
701
+ white-space: nowrap;
702
+ max-width: 100%;
703
+ }
704
+ .database-item-actions[data-v-d46cb2d8] {
705
+ display: flex;
706
+ gap: 4px;
707
+ margin-top: auto;
708
+ }
709
+ .sql-section[data-v-d46cb2d8] {
710
+ display: flex;
711
+ flex-direction: column;
712
+ gap: 16px;
713
+ flex: 1;
714
+ overflow: hidden;
715
+ }
716
+ .sql-header[data-v-d46cb2d8] {
717
+ display: flex;
718
+ justify-content: space-between;
719
+ align-items: center;
720
+ }
721
+ .sql-title[data-v-d46cb2d8] {
722
+ margin: 0;
723
+ font-size: 16px;
724
+ font-weight: 600;
725
+ display: flex;
726
+ align-items: center;
727
+ gap: 8px;
728
+ }
729
+ .sql-db-info[data-v-d46cb2d8] {
730
+ display: flex;
731
+ align-items: center;
732
+ gap: 8px;
733
+ }
734
+
735
+ /* 响应式设计 */
736
+ @media (max-width: 768px) {
737
+ .connection-header[data-v-d46cb2d8] {
738
+ flex-direction: column;
739
+ align-items: flex-start;
740
+ gap: 16px;
741
+ }
742
+ .connection-actions[data-v-d46cb2d8] {
743
+ align-self: flex-end;
744
+ }
745
+ .connection-cards[data-v-d46cb2d8] {
746
+ grid-template-columns: 1fr;
747
+ }
748
+ .info-grid[data-v-d46cb2d8] {
749
+ grid-template-columns: 1fr;
750
+ }
751
+ .stats-grid[data-v-d46cb2d8] {
752
+ grid-template-columns: repeat(2, 1fr);
753
+ }
754
+ .actions-grid[data-v-d46cb2d8] {
755
+ grid-template-columns: repeat(2, 1fr);
756
+ }
757
+ .databases-list-simple[data-v-d46cb2d8] {
758
+ grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
759
+ gap: 10px;
760
+ }
761
+ .database-item[data-v-d46cb2d8] {
762
+ padding: 12px;
763
+ min-height: 80px;
764
+ }
765
+ .database-item-icon[data-v-d46cb2d8] {
766
+ font-size: 24px;
767
+ }
768
+ .database-item-name[data-v-d46cb2d8] {
769
+ font-size: 12px;
770
+ }
771
+ .nav-link[data-v-d46cb2d8] {
772
+ padding: 10px 16px;
773
+ font-size: 13px;
774
+ }
775
+ }
776
+
777
+ .section-title[data-v-081084ef] {
778
+ color: #495057;
779
+ font-weight: 600;
780
+ border-bottom: 2px solid #e9ecef;
781
+ padding-bottom: 0.5rem;
782
+ margin-bottom: 1rem;
783
+ }
784
+ .sql-preview[data-v-081084ef] {
785
+ font-family: 'Courier New', monospace;
786
+ font-size: 0.875rem;
787
+ max-height: 200px;
788
+ overflow-y: auto;
789
+ border: 1px solid #dee2e6;
790
+ }
791
+ .table th[data-v-081084ef] {
792
+ font-size: 0.875rem;
793
+ font-weight: 600;
794
+ }
795
+ .table td[data-v-081084ef] {
796
+ padding: 0!important;
797
+ }
798
+ .table .form-control[data-v-081084ef], .table .form-select[data-v-081084ef] {
799
+ border: none;
800
+ border-radius: 0;
801
+ box-shadow: none;
802
+ }
803
+ .form-control-sm[data-v-081084ef], .form-select-sm[data-v-081084ef] {
804
+ font-size: 0.875rem;
805
+ }
806
+ .modal-content[data-v-081084ef] {
807
+ max-height: 90vh;
808
+ overflow-y: auto;
809
+ }
810
+ .modal-body[data-v-081084ef] {
811
+ max-height: calc(90vh - 120px);
812
+ overflow-y: auto;
813
+ }
814
+ .input-group-sm .form-control[data-v-081084ef] {
815
+ border-radius: 0;
816
+ }
817
+ .input-group-sm .form-control[data-v-081084ef]:first-child {
818
+ border-top-left-radius: 0.25rem;
819
+ border-bottom-left-radius: 0.25rem;
820
+ }
821
+ .input-group-sm .form-control[data-v-081084ef]:last-child {
822
+ border-top-right-radius: 0.25rem;
823
+ border-bottom-right-radius: 0.25rem;
824
+ }
825
+ .text-muted[data-v-081084ef] {
826
+ color: #6c757d !important;
827
+ }
828
+
829
+ .db-tools[data-v-94a9d8f2] {
830
+ background: white;
831
+ border-radius: 12px;
832
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
833
+ overflow: hidden;
834
+ }
835
+ .tools-header[data-v-94a9d8f2] {
836
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
837
+ color: white;
838
+ padding: 1rem 1.5rem;
839
+ border-bottom: 1px solid #e2e8f0;
840
+ }
841
+ .tools-title[data-v-94a9d8f2] {
842
+ margin: 0;
843
+ font-size: 1.1rem;
844
+ font-weight: 600;
845
+ display: flex;
846
+ align-items: center;
847
+ gap: 0.5rem;
848
+ }
849
+ .tools-content[data-v-94a9d8f2] {
850
+ padding: 1.5rem;
851
+ max-height: 500px;
852
+ overflow-y: auto;
853
+ }
854
+ .tool-section[data-v-94a9d8f2] {
855
+ margin-bottom: 2rem;
856
+ }
857
+ .section-title[data-v-94a9d8f2] {
858
+ font-size: 0.9rem;
859
+ font-weight: 600;
860
+ color: #374151;
861
+ margin-bottom: 1rem;
862
+ display: flex;
863
+ align-items: center;
864
+ gap: 0.5rem;
865
+ }
866
+ .tool-actions[data-v-94a9d8f2] {
867
+ display: flex;
868
+ flex-wrap: wrap;
869
+ gap: 0.5rem;
870
+ }
871
+ .tool-actions .btn[data-v-94a9d8f2] {
872
+ min-width: 120px;
873
+ display: flex;
874
+ align-items: center;
875
+ gap: 0.5rem;
876
+ }
877
+ .health-results[data-v-94a9d8f2] {
878
+ max-height: 400px;
879
+ overflow-y: auto;
880
+ }
881
+ .health-item[data-v-94a9d8f2] {
882
+ display: flex;
883
+ align-items: center;
884
+ padding: 0.75rem;
885
+ border-bottom: 1px solid #e2e8f0;
886
+ }
887
+ .health-status[data-v-94a9d8f2] {
888
+ min-width: 150px;
889
+ font-weight: 600;
890
+ display: flex;
891
+ align-items: center;
892
+ gap: 0.5rem;
893
+ }
894
+ .health-message[data-v-94a9d8f2] {
895
+ flex: 1;
896
+ color: #6b7280;
897
+ }
898
+ .modal[data-v-94a9d8f2] {
899
+ background-color: rgba(0, 0, 0, 0.5);
900
+ }
901
+ .modal-dialog[data-v-94a9d8f2] {
902
+ max-width: 600px;
903
+ }
904
+ .modal-lg .modal-dialog[data-v-94a9d8f2] {
905
+ max-width: 800px;
906
+ }
907
+ .modal-header[data-v-94a9d8f2] {
908
+ background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);
909
+ border-bottom: 1px solid #e2e8f0;
910
+ }
911
+ .modal-title[data-v-94a9d8f2] {
912
+ color: #1e293b;
913
+ font-weight: 600;
914
+ }
915
+ .modal-footer[data-v-94a9d8f2] {
916
+ background: #f8fafc;
917
+ border-top: 1px solid #e2e8f0;
918
+ }
919
+
920
+ .database-detail[data-v-fd20d470] {
921
+ width: 100%;
922
+ height: 100%;
923
+ display: flex;
924
+ flex-direction: column;
925
+ }
926
+ .sql-executor-section[data-v-fd20d470] {
927
+ margin: 15px 0;
928
+ padding: 15px;
929
+ background-color: #f8f9fa;
930
+ border-radius: 4px;
931
+ border: 1px solid #dee2e6;
932
+ flex: 1;
933
+ display: flex;
934
+ }
935
+
936
+ /* 加载状态样式 */
937
+ .loading-state[data-v-fd20d470] {
938
+ display: flex;
939
+ flex-direction: column;
940
+ align-items: center;
941
+ justify-content: center;
942
+ padding: 40px 0;
943
+ color: #6c757d;
944
+ }
945
+ .loading-state .spinner-border[data-v-fd20d470] {
946
+ margin-bottom: 15px;
947
+ color: #0d6efd;
948
+ }
949
+ .loading-state p[data-v-fd20d470] {
950
+ margin: 0;
951
+ font-size: 14px;
952
+ }
953
+ .database-header[data-v-fd20d470] {
954
+ padding: 1rem;
955
+ background: linear-gradient(135deg, #f8fafc 0%, #e2e8f0 100%);
956
+ border-bottom: 1px solid #e2e8f0;
957
+ }
958
+ .database-header-content[data-v-fd20d470] {
959
+ display: flex;
960
+ justify-content: space-between;
961
+ align-items: center;
962
+ gap: 2rem;
963
+ }
964
+ .database-info[data-v-fd20d470] {
965
+ display: flex;
966
+ align-items: center;
967
+ gap: 1rem;
968
+ }
969
+ .database-icon[data-v-fd20d470] {
970
+ width: 60px;
971
+ height: 60px;
972
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
973
+ border-radius: 12px;
974
+ display: flex;
975
+ align-items: center;
976
+ justify-content: center;
977
+ color: white;
978
+ font-size: 1.5rem;
979
+ }
980
+ .database-meta h4[data-v-fd20d470] {
981
+ margin: 0 0 0.5rem 0;
982
+ color: #1e293b;
983
+ font-weight: 600;
984
+ }
985
+ .connection-info[data-v-fd20d470] {
986
+ display: flex;
987
+ gap: 0.75rem;
988
+ }
989
+ .connection-name[data-v-fd20d470] {
990
+ background: rgba(102, 126, 234, 0.1);
991
+ color: #667eea;
992
+ padding: 0.25rem 0.5rem;
993
+ border-radius: 12px;
994
+ font-size: 0.875rem;
995
+ font-weight: 500;
996
+ }
997
+ .connection-type[data-v-fd20d470] {
998
+ background: #f1f5f9;
999
+ color: #64748b;
1000
+ padding: 0.25rem 0.5rem;
1001
+ border-radius: 12px;
1002
+ font-size: 0.875rem;
1003
+ font-weight: 500;
1004
+ }
1005
+ .database-stats[data-v-fd20d470] {
1006
+ display: flex;
1007
+ gap: 2rem;
1008
+ }
1009
+ .stat-item[data-v-fd20d470] {
1010
+ text-align: center;
1011
+ }
1012
+ .stat-value[data-v-fd20d470] {
1013
+ font-size: 1.5rem;
1014
+ font-weight: 700;
1015
+ color: #1e293b;
1016
+ margin-bottom: 0.25rem;
1017
+ }
1018
+ .stat-label[data-v-fd20d470] {
1019
+ font-size: 0.875rem;
1020
+ color: #64748b;
1021
+ font-weight: 500;
1022
+ }
1023
+ .database-tabs[data-v-fd20d470] {
1024
+ flex: 1;
1025
+ overflow: hidden;
1026
+ display: flex;
1027
+ flex-direction: column;
1028
+ }
1029
+ .nav-tabs[data-v-fd20d470] {
1030
+ background: #f8fafc;
1031
+ border-bottom: 1px solid #e2e8f0;
1032
+ padding: 0 1.5rem;
1033
+ }
1034
+ .nav-link[data-v-fd20d470] {
1035
+ border: none;
1036
+ background: transparent;
1037
+ color: #64748b;
1038
+ padding: 1rem 1.5rem;
1039
+ font-weight: 500;
1040
+ transition: all 0.2s ease;
1041
+ }
1042
+ .nav-link[data-v-fd20d470]:hover {
1043
+ color: #667eea;
1044
+ background: rgba(102, 126, 234, 0.1);
1045
+ }
1046
+ .nav-link.active[data-v-fd20d470] {
1047
+ color: #667eea;
1048
+ background: white;
1049
+ border-bottom: 2px solid #667eea;
1050
+ }
1051
+ .tab-content[data-v-fd20d470] {
1052
+ padding: 1.5rem;
1053
+ overflow-y: auto;
1054
+ flex: 1;
1055
+ display: flex;
1056
+ flex-direction: column;
1057
+ }
1058
+ .tab-panel[data-v-fd20d470] {
1059
+ flex: 1;
1060
+ overflow-y: auto;
1061
+ display: flex;
1062
+ flex-direction: column;
1063
+ }
1064
+ .table-grid[data-v-fd20d470] {
1065
+ display: grid;
1066
+ grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
1067
+ gap: 1rem;
1068
+ }
1069
+ .table-card[data-v-fd20d470] {
1070
+ background: white;
1071
+ border: 1px solid #e2e8f0;
1072
+ border-radius: 12px;
1073
+ overflow: hidden;
1074
+ transition: all 0.2s ease;
1075
+ cursor: pointer;
1076
+ }
1077
+ .table-card[data-v-fd20d470]:hover {
1078
+ border-color: #667eea;
1079
+ box-shadow: 0 4px 12px rgba(102, 126, 234, 0.15);
1080
+ transform: translateY(-2px);
1081
+ }
1082
+ .card-header[data-v-fd20d470] {
1083
+ background: #f8fafc;
1084
+ padding: 1rem;
1085
+ display: flex;
1086
+ align-items: center;
1087
+ gap: 0.75rem;
1088
+ }
1089
+ .table-icon[data-v-fd20d470] {
1090
+ width: 40px;
1091
+ height: 40px;
1092
+ background: linear-gradient(135deg, #10b981 0%, #059669 100%);
1093
+ border-radius: 8px;
1094
+ display: flex;
1095
+ align-items: center;
1096
+ justify-content: center;
1097
+ color: white;
1098
+ }
1099
+ .table-name[data-v-fd20d470] {
1100
+ font-weight: 600;
1101
+ color: #1e293b;
1102
+ margin-bottom: 0.25rem;
1103
+ }
1104
+ .table-engine[data-v-fd20d470] {
1105
+ font-size: 0.75rem;
1106
+ color: #64748b;
1107
+ background: #f1f5f9;
1108
+ padding: 0.125rem 0.375rem;
1109
+ border-radius: 8px;
1110
+ }
1111
+ .card-body[data-v-fd20d470] {
1112
+ padding: 1rem;
1113
+ }
1114
+ .table-stats[data-v-fd20d470] {
1115
+ display: flex;
1116
+ gap: 1rem;
1117
+ margin-bottom: 0.75rem;
1118
+ }
1119
+ .stat[data-v-fd20d470] {
1120
+ display: flex;
1121
+ flex-direction: column;
1122
+ gap: 0.25rem;
1123
+ }
1124
+ .table-comment[data-v-fd20d470] {
1125
+ font-size: 0.875rem;
1126
+ color: #64748b;
1127
+ font-style: italic;
1128
+ margin-bottom: 0.75rem;
1129
+ line-height: 1.4;
1130
+ }
1131
+ .table-actions[data-v-fd20d470] {
1132
+ display: flex;
1133
+ gap: 0.5rem;
1134
+ }
1135
+ .empty-state[data-v-fd20d470] {
1136
+ display: flex;
1137
+ flex-direction: column;
1138
+ align-items: center;
1139
+ justify-content: center;
1140
+ height: 200px;
1141
+ color: #64748b;
1142
+ text-align: center;
1143
+ font-size: 1.5rem;
1144
+ }
1145
+ .empty-state i[data-v-fd20d470] {
1146
+ margin-bottom: 1rem;
1147
+ opacity: 0.5;
1148
+ }
1149
+
1150
+ /* 视图和存储过程卡片样式 */
1151
+ .views-grid[data-v-fd20d470], .procedures-grid[data-v-fd20d470] {
1152
+ display: grid;
1153
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
1154
+ gap: 1rem;
1155
+ }
1156
+ .view-card[data-v-fd20d470], .procedure-card[data-v-fd20d470] {
1157
+ background: white;
1158
+ border: 1px solid #e2e8f0;
1159
+ border-radius: 12px;
1160
+ overflow: hidden;
1161
+ transition: all 0.2s ease;
1162
+ }
1163
+ .view-card[data-v-fd20d470]:hover, .procedure-card[data-v-fd20d470]:hover {
1164
+ border-color: #667eea;
1165
+ box-shadow: 0 4px 12px rgba(102, 126, 234, 0.15);
1166
+ transform: translateY(-2px);
1167
+ }
1168
+ .view-card .card-header[data-v-fd20d470], .procedure-card .card-header[data-v-fd20d470] {
1169
+ background: #f8fafc;
1170
+ padding: 1rem;
1171
+ display: flex;
1172
+ align-items: center;
1173
+ gap: 0.75rem;
1174
+ }
1175
+ .view-icon[data-v-fd20d470], .procedure-icon[data-v-fd20d470] {
1176
+ width: 40px;
1177
+ height: 40px;
1178
+ background: linear-gradient(135deg, #3b82f6 0%, #2563eb 100%);
1179
+ border-radius: 8px;
1180
+ display: flex;
1181
+ align-items: center;
1182
+ justify-content: center;
1183
+ color: white;
1184
+ }
1185
+ .procedure-icon[data-v-fd20d470] {
1186
+ background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);
1187
+ }
1188
+ .view-name[data-v-fd20d470], .procedure-name[data-v-fd20d470] {
1189
+ font-weight: 600;
1190
+ color: #1e293b;
1191
+ margin-bottom: 0.25rem;
1192
+ }
1193
+ .view-comment[data-v-fd20d470], .procedure-comment[data-v-fd20d470] {
1194
+ font-size: 0.75rem;
1195
+ color: #64748b;
1196
+ margin-bottom: 0.5rem;
1197
+ line-height: 1.4;
1198
+ }
1199
+ .procedure-type[data-v-fd20d470] {
1200
+ display: flex;
1201
+ gap: 0.25rem;
1202
+ flex-wrap: wrap;
1203
+ }
1204
+ .view-card .card-body[data-v-fd20d470], .procedure-card .card-body[data-v-fd20d470] {
1205
+ padding: 1rem;
1206
+ }
1207
+ .view-actions[data-v-fd20d470], .procedure-actions[data-v-fd20d470] {
1208
+ display: flex;
1209
+ gap: 0.5rem;
1210
+ }
1211
+ .views-actions[data-v-fd20d470], .procedures-actions[data-v-fd20d470], .tables-actions[data-v-fd20d470] {
1212
+ display: flex;
1213
+ gap: 0.5rem;
1214
+ margin-bottom: 1rem;
1215
+ padding: 0.75rem 1rem;
1216
+ background: #f8fafc;
1217
+ border-radius: 8px;
1218
+ }
1219
+
1220
+ /* 模态框样式 */
1221
+ .modal-dialog[data-v-fd20d470] {
1222
+ margin-top: 10vh;
1223
+ }
1224
+ .modal-content[data-v-fd20d470] {
1225
+ border-radius: 12px;
1226
+ border: none;
1227
+ box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1);
1228
+ }
1229
+ .modal-header[data-v-fd20d470] {
1230
+ border-bottom: 1px solid #e2e8f0;
1231
+ padding: 1rem 1.5rem;
1232
+ }
1233
+ .modal-title[data-v-fd20d470] {
1234
+ margin: 0;
1235
+ font-weight: 600;
1236
+ color: #1e293b;
1237
+ }
1238
+ .modal-body[data-v-fd20d470] {
1239
+ padding: 1.5rem;
1240
+ }
1241
+ .modal-footer[data-v-fd20d470] {
1242
+ border-top: 1px solid #e2e8f0;
1243
+ padding: 1rem 1.5rem;
1244
+ display: flex;
1245
+ justify-content: flex-end;
1246
+ gap: 0.5rem;
1247
+ }
1248
+
1249
+ .modal[data-v-bc488007] {
1250
+ background-color: rgba(0, 0, 0, 0.5);
1251
+ }
1252
+ .modal-dialog[data-v-bc488007] {
1253
+ max-width: 800px;
1254
+ }
1255
+ .form-label[data-v-bc488007] {
1256
+ font-weight: 500;
1257
+ color: #374151;
1258
+ }
1259
+ .form-control[data-v-bc488007], .form-select[data-v-bc488007] {
1260
+ border: 1px solid #d1d5db;
1261
+ border-radius: 6px;
1262
+ }
1263
+ .form-control[data-v-bc488007]:focus, .form-select[data-v-bc488007]:focus {
1264
+ border-color: #3b82f6;
1265
+ box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
1266
+ }
1267
+ .modal-header[data-v-bc488007] {
1268
+ background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);
1269
+ border-bottom: 1px solid #e2e8f0;
1270
+ }
1271
+ .modal-title[data-v-bc488007] {
1272
+ color: #1e293b;
1273
+ font-weight: 600;
1274
+ }
1275
+ .modal-footer[data-v-bc488007] {
1276
+ background: #f8fafc;
1277
+ border-top: 1px solid #e2e8f0;
1278
+ }
1279
+ .text-danger[data-v-bc488007] {
1280
+ color: #ef4444;
1281
+ }
1282
+ .text-muted[data-v-bc488007] {
1283
+ color: #6b7280;
1284
+ font-size: 0.875rem;
1285
+ }
1286
+ .json-editor textarea[data-v-bc488007] {
1287
+ font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
1288
+ font-size: 0.875rem;
1289
+ line-height: 1.5;
1290
+ background-color: #f8fafc;
1291
+ border-color: #e2e8f0;
1292
+ resize: vertical;
1293
+ }
1294
+ .json-editor textarea[data-v-bc488007]:focus {
1295
+ background-color: #ffffff;
1296
+ border-color: #3b82f6;
1297
+ box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
1298
+ }
1299
+ .json-editor .text-muted[data-v-bc488007] {
1300
+ font-size: 0.75rem;
1301
+ }
1302
+
1303
+ .table-detail[data-v-365fca24] {
1304
+ width: 100%;
1305
+ height: 100%;
1306
+ display: flex;
1307
+ flex-direction: column;
1308
+ }
1309
+ .table-header[data-v-365fca24] {
1310
+ background-color: #f8f9fa;
1311
+ border-bottom: 1px solid #dee2e6;
1312
+ padding: 15px 20px;
1313
+ }
1314
+ .table-header-content[data-v-365fca24] {
1315
+ display: flex;
1316
+ justify-content: space-between;
1317
+ align-items: center;
1318
+ }
1319
+ .table-info[data-v-365fca24] {
1320
+ display: flex;
1321
+ align-items: center;
1322
+ gap: 15px;
1323
+ }
1324
+ .table-icon[data-v-365fca24] {
1325
+ font-size: 32px;
1326
+ color: #495057;
1327
+ }
1328
+ .table-meta[data-v-365fca24] {
1329
+ display: flex;
1330
+ flex-direction: column;
1331
+ gap: 5px;
1332
+ }
1333
+ .table-name[data-v-365fca24] {
1334
+ margin: 0;
1335
+ font-size: 1.25rem;
1336
+ font-weight: 600;
1337
+ }
1338
+ .table-breadcrumb[data-v-365fca24] {
1339
+ display: flex;
1340
+ align-items: center;
1341
+ gap: 8px;
1342
+ font-size: 0.875rem;
1343
+ color: #6c757d;
1344
+ }
1345
+ .table-stats[data-v-365fca24] {
1346
+ display: flex;
1347
+ gap: 20px;
1348
+ }
1349
+ .stat-item[data-v-365fca24] {
1350
+ display: flex;
1351
+ flex-direction: column;
1352
+ align-items: center;
1353
+ gap: 2px;
1354
+ }
1355
+ .stat-value[data-v-365fca24] {
1356
+ font-size: 1.125rem;
1357
+ font-weight: 600;
1358
+ color: #495057;
1359
+ }
1360
+ .stat-label[data-v-365fca24] {
1361
+ font-size: 0.75rem;
1362
+ color: #6c757d;
1363
+ }
1364
+ .table-toolbar[data-v-365fca24] {
1365
+ display: flex;
1366
+ justify-content: space-between;
1367
+ align-items: center;
1368
+ padding: 10px 20px;
1369
+ background-color: #f8f9fa;
1370
+ border-bottom: 1px solid #dee2e6;
1371
+ }
1372
+ .toolbar-left[data-v-365fca24] {
1373
+ display: flex;
1374
+ gap: 10px;
1375
+ align-items: center;
1376
+ }
1377
+ .toolbar-right[data-v-365fca24] {
1378
+ display: flex;
1379
+ gap: 10px;
1380
+ align-items: center;
1381
+ }
1382
+ .table-tabs[data-v-365fca24] {
1383
+ flex: 1;
1384
+ display: flex;
1385
+ flex-direction: column;
1386
+ overflow: hidden;
1387
+ }
1388
+ .nav-tabs[data-v-365fca24] {
1389
+ border-bottom: 1px solid #dee2e6;
1390
+ background-color: #f8f9fa;
1391
+ }
1392
+ .nav-tabs .nav-link[data-v-365fca24] {
1393
+ color: #495057;
1394
+ border: none;
1395
+ border-bottom: 3px solid transparent;
1396
+ border-radius: 0;
1397
+ padding: 10px 15px;
1398
+ font-weight: 500;
1399
+ }
1400
+ .nav-tabs .nav-link[data-v-365fca24]:hover {
1401
+ background-color: #e9ecef;
1402
+ border-bottom-color: #adb5bd;
1403
+ }
1404
+ .nav-tabs .nav-link.active[data-v-365fca24] {
1405
+ background-color: #fff;
1406
+ border-bottom-color: #0d6efd;
1407
+ color: #0d6efd;
1408
+ }
1409
+ .tab-content[data-v-365fca24] {
1410
+ flex: 1;
1411
+ overflow: auto;
1412
+ padding: 20px;
1413
+ background-color: #fff;
1414
+ }
1415
+ .tab-panel[data-v-365fca24] {
1416
+ height: 100%;
1417
+ }
1418
+ .data-content[data-v-365fca24] {
1419
+ height: 100%;
1420
+ display: flex;
1421
+ flex-direction: column;
1422
+ }
1423
+ .data-content.loading[data-v-365fca24] {
1424
+ opacity: 0.7;
1425
+ pointer-events: none;
1426
+ }
1427
+ .table-responsive[data-v-365fca24] {
1428
+ flex: 1;
1429
+ overflow: auto;
1430
+ }
1431
+ .column-header[data-v-365fca24] {
1432
+ position: relative;
1433
+ }
1434
+ .column-key[data-v-365fca24] {
1435
+ position: absolute;
1436
+ top: -5px;
1437
+ right: -15px;
1438
+ color: #0d6efd;
1439
+ font-size: 0.75rem;
1440
+ }
1441
+ .cell-value[data-v-365fca24] {
1442
+ max-width: 200px;
1443
+ overflow: hidden;
1444
+ text-overflow: ellipsis;
1445
+ white-space: nowrap;
1446
+ }
1447
+ .loading-state[data-v-365fca24] {
1448
+ display: flex;
1449
+ flex-direction: column;
1450
+ align-items: center;
1451
+ justify-content: center;
1452
+ height: 300px;
1453
+ gap: 15px;
1454
+ }
1455
+ .empty-state[data-v-365fca24] {
1456
+ display: flex;
1457
+ flex-direction: column;
1458
+ align-items: center;
1459
+ justify-content: center;
1460
+ height: 300px;
1461
+ gap: 15px;
1462
+ color: #6c757d;
1463
+ }
1464
+ .empty-state i[data-v-365fca24] {
1465
+ font-size: 48px;
1466
+ opacity: 0.5;
1467
+ }
1468
+ .pagination-nav[data-v-365fca24] {
1469
+ margin-top: 20px;
1470
+ border-top: 1px solid #dee2e6;
1471
+ padding-top: 15px;
1472
+ }
1473
+ .pagination-container[data-v-365fca24] {
1474
+ display: flex;
1475
+ align-items: center;
1476
+ justify-content: space-between;
1477
+ flex-wrap: wrap;
1478
+ gap: 10px;
1479
+ }
1480
+ .pagination-info[data-v-365fca24] {
1481
+ font-size: 0.875rem;
1482
+ color: #6c757d;
1483
+ }
1484
+ .page-size-selector[data-v-365fca24] {
1485
+ display: flex;
1486
+ align-items: center;
1487
+ gap: 5px;
1488
+ }
1489
+ .page-jump[data-v-365fca24] {
1490
+ display: flex;
1491
+ align-items: center;
1492
+ gap: 5px;
1493
+ }
1494
+ .structure-actions[data-v-365fca24] {
1495
+ display: flex;
1496
+ gap: 10px;
1497
+ margin-bottom: 15px;
1498
+ }
1499
+ .structure-table[data-v-365fca24], .indexes-table[data-v-365fca24], .relations-table[data-v-365fca24] {
1500
+ overflow: auto;
1501
+ }
1502
+ .structure-table table[data-v-365fca24], .indexes-table table[data-v-365fca24], .relations-table table[data-v-365fca24] {
1503
+ width: 100%;
1504
+ }
1505
+ .sql-section[data-v-365fca24] {
1506
+ height: 100%;
1507
+ }
1508
+
1509
+ /* 响应式设计 */
1510
+ @media (max-width: 768px) {
1511
+ .table-header-content[data-v-365fca24] {
1512
+ flex-direction: column;
1513
+ align-items: flex-start;
1514
+ gap: 15px;
1515
+ }
1516
+ .table-stats[data-v-365fca24] {
1517
+ width: 100%;
1518
+ justify-content: space-around;
1519
+ }
1520
+ .table-toolbar[data-v-365fca24] {
1521
+ flex-direction: column;
1522
+ align-items: stretch;
1523
+ gap: 10px;
1524
+ }
1525
+ .toolbar-left[data-v-365fca24], .toolbar-right[data-v-365fca24] {
1526
+ justify-content: center;
1527
+ }
1528
+ .pagination-container[data-v-365fca24] {
1529
+ flex-direction: column;
1530
+ align-items: flex-start;
1531
+ gap: 15px;
1532
+ }
1533
+ .pagination[data-v-365fca24] {
1534
+ width: 100%;
1535
+ justify-content: center;
1536
+ }
1537
+ }
1538
+
1539
+ .database-explorer[data-v-f2a7bdef] {
1540
+ height: 100vh;
1541
+ min-height: 600px;
1542
+ }
1543
+ .explorer-layout[data-v-f2a7bdef] {
1544
+ display: flex;
1545
+ height: 100%;
1546
+ background: white;
1547
+ border-radius: 12px;
1548
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
1549
+ overflow: hidden;
1550
+ }
1551
+
1552
+ /* 左侧边栏 */
1553
+ .explorer-sidebar[data-v-f2a7bdef] {
1554
+ width: 350px;
1555
+ flex-shrink: 0;
1556
+ border-right: 1px solid #e1e5e9;
1557
+ display: flex;
1558
+ flex-direction: column;
1559
+ background: #ffffff;
1560
+ }
1561
+ .sidebar-header[data-v-f2a7bdef] {
1562
+ padding: 1rem 0.875rem;
1563
+ border-bottom: 1px solid #e1e5e9;
1564
+ background: #f8f9fa;
1565
+ display: flex;
1566
+ justify-content: space-between;
1567
+ align-items: center;
1568
+ }
1569
+ .sidebar-title[data-v-f2a7bdef] {
1570
+ margin: 0;
1571
+ font-size: 0.9375rem;
1572
+ font-weight: 600;
1573
+ color: #24292f;
1574
+ display: flex;
1575
+ align-items: center;
1576
+ gap: 0.5rem;
1577
+ }
1578
+ .sidebar-title i[data-v-f2a7bdef] {
1579
+ color: #656d76;
1580
+ }
1581
+ .sidebar-actions[data-v-f2a7bdef] {
1582
+ display: flex;
1583
+ gap: 0.25rem;
1584
+ }
1585
+ .sidebar-actions .btn[data-v-f2a7bdef] {
1586
+ padding: 0.375rem 0.625rem;
1587
+ font-size: 0.75rem;
1588
+ border: 1px solid #d0d7de;
1589
+ background-color: #ffffff;
1590
+ color: #24292f;
1591
+ border-radius: 6px;
1592
+ transition: all 0.15s ease;
1593
+ }
1594
+ .sidebar-actions .btn[data-v-f2a7bdef]:hover {
1595
+ background-color: #f3f4f6;
1596
+ border-color: #d0d7de;
1597
+ }
1598
+ .sidebar-actions .btn-outline-primary[data-v-f2a7bdef] {
1599
+ border-color: #0969da;
1600
+ color: #0969da;
1601
+ }
1602
+ .sidebar-actions .btn-outline-primary[data-v-f2a7bdef]:hover {
1603
+ background-color: #0969da;
1604
+ border-color: #0969da;
1605
+ color: #ffffff;
1606
+ }
1607
+ .sidebar-actions .btn-outline-success[data-v-f2a7bdef] {
1608
+ border-color: #1a7f37;
1609
+ color: #1a7f37;
1610
+ }
1611
+ .sidebar-actions .btn-outline-success[data-v-f2a7bdef]:hover {
1612
+ background-color: #1a7f37;
1613
+ border-color: #1a7f37;
1614
+ color: #ffffff;
1615
+ }
1616
+ .sidebar-content[data-v-f2a7bdef] {
1617
+ flex: 1;
1618
+ overflow-y: auto;
1619
+ padding: 0.5rem 0;
1620
+ }
1621
+
1622
+ /* 树形结构 */
1623
+ .tree-container[data-v-f2a7bdef] {
1624
+ font-size: 0.875rem;
1625
+ user-select: none;
1626
+ }
1627
+ .tree-node[data-v-f2a7bdef] {
1628
+ margin-bottom: 0;
1629
+ }
1630
+ .tree-children[data-v-f2a7bdef] {
1631
+ margin-left: 0.75rem;
1632
+ border-left: 1px solid #e1e5e9;
1633
+ padding-left: 0.5rem;
1634
+ }
1635
+ .node-content[data-v-f2a7bdef] {
1636
+ display: flex;
1637
+ align-items: center;
1638
+ padding: 0.375rem 0.75rem;
1639
+ cursor: pointer;
1640
+ transition: background-color 0.15s ease;
1641
+ position: relative;
1642
+ margin-right: 0.5rem;
1643
+ border-radius: 6px;
1644
+ gap: 0.25rem;
1645
+ }
1646
+ .node-expand[data-v-f2a7bdef] {
1647
+ width: 16px;
1648
+ height: 16px;
1649
+ display: flex;
1650
+ align-items: center;
1651
+ justify-content: center;
1652
+ flex-shrink: 0;
1653
+ margin-right: 0.25rem;
1654
+ }
1655
+ .node-expand i[data-v-f2a7bdef] {
1656
+ font-size: 0.6875rem;
1657
+ color: #656d76;
1658
+ transition: transform 0.15s ease;
1659
+ }
1660
+ .node-expand i.expanded[data-v-f2a7bdef] {
1661
+ transform: rotate(90deg);
1662
+ }
1663
+ .node-main[data-v-f2a7bdef] {
1664
+ display: flex;
1665
+ align-items: center;
1666
+ flex: 1;
1667
+ min-width: 0;
1668
+ }
1669
+ .node-content[data-v-f2a7bdef]:hover {
1670
+ background-color: #f3f4f6;
1671
+ }
1672
+ .tree-node.selected .node-content[data-v-f2a7bdef] {
1673
+ background-color: #eff1ff;
1674
+ color: #0969da;
1675
+ font-weight: 500;
1676
+ box-shadow: 0 2px 8px rgba(9, 105, 218, 0.15);
1677
+ }
1678
+ .tree-node.selected .node-content[data-v-f2a7bdef]::before {
1679
+ content: '';
1680
+ position: absolute;
1681
+ left: 0;
1682
+ top: 0;
1683
+ bottom: 0;
1684
+ width: 3px;
1685
+ background: linear-gradient(135deg, #0969da, #0550ae);
1686
+ border-radius: 3px 0 0 3px;
1687
+ }
1688
+ .node-icon[data-v-f2a7bdef] {
1689
+ width: 20px;
1690
+ display: flex;
1691
+ justify-content: center;
1692
+ flex-shrink: 0;
1693
+ margin-right: 0.5rem;
1694
+ }
1695
+ .node-icon i[data-v-f2a7bdef] {
1696
+ font-size: 0.875rem;
1697
+ }
1698
+ .node-label[data-v-f2a7bdef] {
1699
+ flex: 1;
1700
+ display: flex;
1701
+ align-items: center;
1702
+ gap: 0.375rem;
1703
+ min-width: 0;
1704
+ }
1705
+ .connection-name[data-v-f2a7bdef],
1706
+ .database-name[data-v-f2a7bdef],
1707
+ .table-name[data-v-f2a7bdef] {
1708
+ font-weight: 500;
1709
+ white-space: nowrap;
1710
+ overflow: hidden;
1711
+ text-overflow: ellipsis;
1712
+ line-height: 1.25;
1713
+ }
1714
+ .tree-node.selected .connection-name[data-v-f2a7bdef],
1715
+ .tree-node.selected .database-name[data-v-f2a7bdef],
1716
+ .tree-node.selected .table-name[data-v-f2a7bdef] {
1717
+ font-weight: 600;
1718
+ }
1719
+ .connection-type[data-v-f2a7bdef],
1720
+ .table-info[data-v-f2a7bdef] {
1721
+ font-size: 0.75rem;
1722
+ color: #656d76;
1723
+ background-color: #f6f8fa;
1724
+ padding: 0.125rem 0.375rem;
1725
+ border-radius: 12px;
1726
+ font-weight: 500;
1727
+ white-space: nowrap;
1728
+ }
1729
+ .tree-node.selected .connection-type[data-v-f2a7bdef],
1730
+ .tree-node.selected .table-info[data-v-f2a7bdef] {
1731
+ background-color: rgba(9, 105, 218, 0.1);
1732
+ color: #0969da;
1733
+ }
1734
+ .node-actions[data-v-f2a7bdef] {
1735
+ display: flex;
1736
+ gap: 0.125rem;
1737
+ opacity: 0;
1738
+ transition: opacity 0.15s ease;
1739
+ }
1740
+ .node-content:hover .node-actions[data-v-f2a7bdef] {
1741
+ opacity: 1;
1742
+ }
1743
+ .btn-icon[data-v-f2a7bdef] {
1744
+ padding: 0.25rem;
1745
+ background: transparent;
1746
+ border: none;
1747
+ border-radius: 4px;
1748
+ transition: background-color 0.15s ease;
1749
+ display: flex;
1750
+ align-items: center;
1751
+ justify-content: center;
1752
+ width: 20px;
1753
+ height: 20px;
1754
+ }
1755
+ .btn-icon[data-v-f2a7bdef]:hover {
1756
+ background-color: #e1e4e8;
1757
+ }
1758
+ .btn-icon i[data-v-f2a7bdef] {
1759
+ font-size: 0.6875rem;
1760
+ color: #656d76;
1761
+ }
1762
+ .tree-node.selected .btn-icon[data-v-f2a7bdef]:hover {
1763
+ background-color: rgba(9, 105, 218, 0.1);
1764
+ }
1765
+ .tree-node.selected .btn-icon i[data-v-f2a7bdef] {
1766
+ color: #656d76;
1767
+ }
1768
+ .tree-node.selected .btn-icon:hover i[data-v-f2a7bdef] {
1769
+ color: #0969da;
1770
+ }
1771
+ .btn-icon-danger[data-v-f2a7bdef]:hover {
1772
+ background-color: #fee2e2;
1773
+ }
1774
+ .btn-icon-danger:hover i[data-v-f2a7bdef] {
1775
+ color: #dc2626;
1776
+ }
1777
+ .node-spinner[data-v-f2a7bdef] {
1778
+ display: flex;
1779
+ align-items: center;
1780
+ justify-content: center;
1781
+ }
1782
+ .spinner-border-sm[data-v-f2a7bdef] {
1783
+ width: 1rem;
1784
+ height: 1rem;
1785
+ border-width: 0.15em;
1786
+ }
1787
+
1788
+ /* 连接节点样式 */
1789
+ .connection-content[data-v-f2a7bdef] {
1790
+ font-weight: 500;
1791
+ color: #24292f;
1792
+ }
1793
+ .connection-content[data-v-f2a7bdef]:hover {
1794
+ background-color: #f3f4f6;
1795
+ }
1796
+ .tree-node.selected .connection-content[data-v-f2a7bdef] {
1797
+ background-color: #eff1ff;
1798
+ color: #0969da;
1799
+ }
1800
+
1801
+ /* 数据库节点样式 */
1802
+ .database-content[data-v-f2a7bdef] {
1803
+ color: #24292f;
1804
+ }
1805
+ .database-content[data-v-f2a7bdef]:hover {
1806
+ background-color: #f6f8fa;
1807
+ }
1808
+ .tree-node.selected .database-content[data-v-f2a7bdef] {
1809
+ background-color: #eff1ff;
1810
+ color: #0969da;
1811
+ }
1812
+
1813
+ /* 表节点样式 */
1814
+ .table-content[data-v-f2a7bdef] {
1815
+ color: #24292f;
1816
+ }
1817
+ .table-content[data-v-f2a7bdef]:hover {
1818
+ background-color: #f6f8fa;
1819
+ }
1820
+ .tree-node.selected .table-content[data-v-f2a7bdef] {
1821
+ background-color: #eff1ff;
1822
+ color: #0969da;
1823
+ }
1824
+
1825
+ /* 数据库品牌色彩 */
1826
+ .db-mysql[data-v-f2a7bdef] {
1827
+ color: #00758f !important;
1828
+ background: linear-gradient(135deg, #00758f, #005a70);
1829
+ -webkit-background-clip: text;
1830
+ -webkit-text-fill-color: transparent;
1831
+ }
1832
+ .db-mysql-bg[data-v-f2a7bdef] { background: linear-gradient(135deg, #00758f, #005a70);
1833
+ }
1834
+ .db-postgres[data-v-f2a7bdef] {
1835
+ color: #336791 !important;
1836
+ background: linear-gradient(135deg, #336791, #2a5278);
1837
+ -webkit-background-clip: text;
1838
+ -webkit-text-fill-color: transparent;
1839
+ }
1840
+ .db-postgres-bg[data-v-f2a7bdef] { background: linear-gradient(135deg, #336791, #2a5278);
1841
+ }
1842
+ .db-sqlite[data-v-f2a7bdef] {
1843
+ color: #003b57 !important;
1844
+ background: linear-gradient(135deg, #003b57, #002d42);
1845
+ -webkit-background-clip: text;
1846
+ -webkit-text-fill-color: transparent;
1847
+ }
1848
+ .db-sqlite-bg[data-v-f2a7bdef] { background: linear-gradient(135deg, #003b57, #002d42);
1849
+ }
1850
+ .db-mssql[data-v-f2a7bdef] {
1851
+ color: #cc2927 !important;
1852
+ background: linear-gradient(135deg, #cc2927, #a62220);
1853
+ -webkit-background-clip: text;
1854
+ -webkit-text-fill-color: transparent;
1855
+ }
1856
+ .db-mssql-bg[data-v-f2a7bdef] { background: linear-gradient(135deg, #cc2927, #a62220);
1857
+ }
1858
+ .db-oracle[data-v-f2a7bdef] {
1859
+ color: #f80000 !important;
1860
+ background: linear-gradient(135deg, #f80000, #d40000);
1861
+ -webkit-background-clip: text;
1862
+ -webkit-text-fill-color: transparent;
1863
+ }
1864
+ .db-oracle-bg[data-v-f2a7bdef] { background: linear-gradient(135deg, #f80000, #d40000);
1865
+ }
1866
+ .db-default[data-v-f2a7bdef] {
1867
+ color: #64748b !important;
1868
+ background: linear-gradient(135deg, #64748b, #475569);
1869
+ -webkit-background-clip: text;
1870
+ -webkit-text-fill-color: transparent;
1871
+ }
1872
+ .db-default-bg[data-v-f2a7bdef] { background: linear-gradient(135deg, #64748b, #475569);
1873
+ }
1874
+ .tree-node.selected .db-mysql[data-v-f2a7bdef],
1875
+ .tree-node.selected .db-postgres[data-v-f2a7bdef],
1876
+ .tree-node.selected .db-sqlite[data-v-f2a7bdef],
1877
+ .tree-node.selected .db-mssql[data-v-f2a7bdef],
1878
+ .tree-node.selected .db-oracle[data-v-f2a7bdef],
1879
+ .tree-node.selected .db-default[data-v-f2a7bdef] {
1880
+ color: white !important;
1881
+ background: none;
1882
+ -webkit-text-fill-color: white;
1883
+ }
1884
+
1885
+ /* 数据库Logo图标 */
1886
+ .db-logo[data-v-f2a7bdef] {
1887
+ width: 20px;
1888
+ height: 20px;
1889
+ border-radius: 4px;
1890
+ display: flex;
1891
+ align-items: center;
1892
+ justify-content: center;
1893
+ font-weight: 700;
1894
+ font-size: 0.75rem;
1895
+ color: white;
1896
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
1897
+ }
1898
+ .db-logo-mysql[data-v-f2a7bdef] {
1899
+ background: linear-gradient(135deg, #00758f, #005a70);
1900
+ border: 1px solid #004d61;
1901
+ }
1902
+ .db-logo-postgres[data-v-f2a7bdef] {
1903
+ background: linear-gradient(135deg, #336791, #2a5278);
1904
+ border: 1px solid #244566;
1905
+ }
1906
+ .db-logo-sqlite[data-v-f2a7bdef] {
1907
+ background: linear-gradient(135deg, #003b57, #002d42);
1908
+ border: 1px solid #002939;
1909
+ }
1910
+ .db-logo-mssql[data-v-f2a7bdef] {
1911
+ background: linear-gradient(135deg, #cc2927, #a62220);
1912
+ border: 1px solid #8b1f1d;
1913
+ }
1914
+ .db-logo-oracle[data-v-f2a7bdef] {
1915
+ background: linear-gradient(135deg, #f80000, #d40000);
1916
+ border: 1px solid #b30000;
1917
+ }
1918
+ .db-logo-default[data-v-f2a7bdef] {
1919
+ background: linear-gradient(135deg, #64748b, #475569);
1920
+ border: 1px solid #334155;
1921
+ }
1922
+
1923
+ /* 右侧主内容 */
1924
+ .explorer-main[data-v-f2a7bdef] {
1925
+ flex: 1;
1926
+ display: flex;
1927
+ flex-direction: column;
1928
+ overflow: hidden;
1929
+ height: 100%;
1930
+ }
1931
+
1932
+ /* 详情组件容器 */
1933
+ .explorer-main[data-v-f2a7bdef] > * {
1934
+ flex: 1;
1935
+ display: flex;
1936
+ flex-direction: column;
1937
+ height: 100%;
1938
+ }
1939
+ .content-tabs[data-v-f2a7bdef] {
1940
+ flex: 1;
1941
+ display: flex;
1942
+ flex-direction: column;
1943
+ height: 100%;
1944
+ }
1945
+ .nav-tabs[data-v-f2a7bdef] {
1946
+ background: #f8fafc;
1947
+ border-bottom: 1px solid #e2e8f0;
1948
+ padding: 0 1rem;
1949
+ }
1950
+ .nav-link[data-v-f2a7bdef] {
1951
+ border: none;
1952
+ background: transparent;
1953
+ color: #64748b;
1954
+ padding: 1rem 1.5rem;
1955
+ font-weight: 500;
1956
+ transition: all 0.2s ease;
1957
+ }
1958
+ .nav-link[data-v-f2a7bdef]:hover {
1959
+ color: #667eea;
1960
+ background: rgba(102, 126, 234, 0.1);
1961
+ }
1962
+ .nav-link.active[data-v-f2a7bdef] {
1963
+ color: #667eea;
1964
+ background: white;
1965
+ border-bottom: 2px solid #667eea;
1966
+ }
1967
+ .tab-content[data-v-f2a7bdef] {
1968
+ flex: 1;
1969
+ overflow-y: auto;
1970
+ padding: 1.5rem;
1971
+ height: calc(100% - 60px); /* 减去导航栏高度 */
1972
+ }
1973
+
1974
+ /* 概览样式 */
1975
+ .overview-section[data-v-f2a7bdef] {
1976
+ padding: 1rem 0;
1977
+ }
1978
+ .info-cards[data-v-f2a7bdef] {
1979
+ display: grid;
1980
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
1981
+ gap: 1rem;
1982
+ }
1983
+ .info-card[data-v-f2a7bdef] {
1984
+ background: linear-gradient(135deg, #f8fafc 0%, #e2e8f0 100%);
1985
+ border-radius: 12px;
1986
+ padding: 1.5rem;
1987
+ display: flex;
1988
+ align-items: center;
1989
+ gap: 1rem;
1990
+ border: 1px solid #e2e8f0;
1991
+ }
1992
+ .card-icon[data-v-f2a7bdef] {
1993
+ width: 48px;
1994
+ height: 48px;
1995
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
1996
+ border-radius: 12px;
1997
+ display: flex;
1998
+ align-items: center;
1999
+ justify-content: center;
2000
+ color: white;
2001
+ font-size: 1.25rem;
2002
+ }
2003
+ .card-content h6[data-v-f2a7bdef] {
2004
+ margin: 0 0 0.25rem 0;
2005
+ color: #64748b;
2006
+ font-size: 0.875rem;
2007
+ font-weight: 500;
2008
+ }
2009
+ .card-value[data-v-f2a7bdef] {
2010
+ margin: 0;
2011
+ color: #1e293b;
2012
+ font-weight: 600;
2013
+ font-size: 1.1rem;
2014
+ }
2015
+
2016
+ /* 表格网格 */
2017
+ .table-grid[data-v-f2a7bdef] {
2018
+ display: grid;
2019
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
2020
+ gap: 1rem;
2021
+ }
2022
+ .table-card[data-v-f2a7bdef] {
2023
+ background: white;
2024
+ border: 1px solid #e2e8f0;
2025
+ border-radius: 12px;
2026
+ padding: 1rem;
2027
+ cursor: pointer;
2028
+ transition: all 0.2s ease;
2029
+ }
2030
+ .table-card[data-v-f2a7bdef]:hover {
2031
+ border-color: #667eea;
2032
+ box-shadow: 0 4px 12px rgba(102, 126, 234, 0.15);
2033
+ transform: translateY(-2px);
2034
+ }
2035
+ .table-card .card-header[data-v-f2a7bdef] {
2036
+ display: flex;
2037
+ align-items: center;
2038
+ gap: 0.75rem;
2039
+ margin-bottom: 0.75rem;
2040
+ }
2041
+ .table-icon[data-v-f2a7bdef] {
2042
+ width: 32px;
2043
+ height: 32px;
2044
+ background: linear-gradient(135deg, #10b981 0%, #059669 100%);
2045
+ border-radius: 8px;
2046
+ display: flex;
2047
+ align-items: center;
2048
+ justify-content: center;
2049
+ color: white;
2050
+ }
2051
+ .table-name[data-v-f2a7bdef] {
2052
+ font-weight: 600;
2053
+ color: #1e293b;
2054
+ }
2055
+ .table-stats[data-v-f2a7bdef] {
2056
+ display: flex;
2057
+ gap: 1rem;
2058
+ margin-bottom: 0.5rem;
2059
+ }
2060
+ .stat[data-v-f2a7bdef] {
2061
+ display: flex;
2062
+ flex-direction: column;
2063
+ gap: 0.25rem;
2064
+ }
2065
+ .stat-label[data-v-f2a7bdef] {
2066
+ font-size: 0.75rem;
2067
+ color: #64748b;
2068
+ }
2069
+ .stat-value[data-v-f2a7bdef] {
2070
+ font-size: 0.875rem;
2071
+ font-weight: 600;
2072
+ color: #1e293b;
2073
+ }
2074
+ .table-comment[data-v-f2a7bdef] {
2075
+ font-size: 0.75rem;
2076
+ color: #64748b;
2077
+ font-style: italic;
2078
+ }
2079
+
2080
+ /* 数据工具栏 */
2081
+ .data-toolbar[data-v-f2a7bdef] {
2082
+ display: flex;
2083
+ justify-content: space-between;
2084
+ align-items: center;
2085
+ margin-bottom: 1rem;
2086
+ padding: 0.75rem;
2087
+ background: #f8fafc;
2088
+ border-radius: 8px;
2089
+ }
2090
+ .toolbar-left[data-v-f2a7bdef],
2091
+ .toolbar-right[data-v-f2a7bdef] {
2092
+ display: flex;
2093
+ gap: 0.5rem;
2094
+ align-items: center;
2095
+ }
2096
+
2097
+ /* 空状态 */
2098
+ .empty-state[data-v-f2a7bdef],
2099
+ .default-state[data-v-f2a7bdef] {
2100
+ display: flex;
2101
+ flex-direction: column;
2102
+ align-items: center;
2103
+ justify-content: center;
2104
+ height: 100%;
2105
+ color: #64748b;
2106
+ text-align: center;
2107
+ }
2108
+ .empty-icon[data-v-f2a7bdef],
2109
+ .default-icon[data-v-f2a7bdef] {
2110
+ font-size: 3rem;
2111
+ margin-bottom: 1rem;
2112
+ opacity: 0.5;
2113
+ }
2114
+ .empty-text h5[data-v-f2a7bdef],
2115
+ .default-content h5[data-v-f2a7bdef] {
2116
+ color: #64748b;
2117
+ margin-bottom: 0.5rem;
2118
+ }
2119
+
2120
+ /* 响应式 */
2121
+ @media (max-width: 768px) {
2122
+ .explorer-layout[data-v-f2a7bdef] {
2123
+ flex-direction: column;
2124
+ }
2125
+ .explorer-sidebar[data-v-f2a7bdef] {
2126
+ width: 100%;
2127
+ height: 40vh;
2128
+ border-right: none;
2129
+ border-bottom: 1px solid #e2e8f0;
2130
+ }
2131
+ .info-cards[data-v-f2a7bdef] {
2132
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
2133
+ }
2134
+ .table-grid[data-v-f2a7bdef] {
2135
+ grid-template-columns: 1fr;
2136
+ }
2137
+ }