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,1071 @@
1
+ /* 数据库管理工具全局样式 - 现代桌面应用设计 */
2
+
3
+ /* 基础变量 - 现代色彩方案 */
4
+ :root {
5
+ /* 主色调 - 紫色渐变 */
6
+ --db-primary-color: #667eea;
7
+ --db-primary-dark: #5a67d8;
8
+ --db-primary-light: #7c8bf8;
9
+ --db-primary-gradient: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
10
+
11
+ /* 辅助色彩 */
12
+ --db-secondary-color: #6c757d;
13
+ --db-accent-color: #10b981;
14
+ --db-warning-color: #f59e0b;
15
+ --db-danger-color: #ef4444;
16
+ --db-info-color: #3b82f6;
17
+
18
+ /* 中性色彩 */
19
+ --db-light-color: #f8fafc;
20
+ --db-gray-light: #f1f5f9;
21
+ --db-gray-medium: #e2e8f0;
22
+ --db-gray-dark: #94a3b8;
23
+ --db-darker-color: #64748b;
24
+ --db-dark-color: #1e293b;
25
+ --db-black: #0f172a;
26
+
27
+ /* 背景渐变 */
28
+ --db-bg-gradient: linear-gradient(135deg, #f8fafc 0%, #e2e8f0 100%);
29
+ --db-card-gradient: linear-gradient(135deg, #ffffff 0%, #f8fafc 100%);
30
+
31
+ /* 阴影 */
32
+ --db-shadow-sm: 0 2px 4px rgba(0, 0, 0, 0.05);
33
+ --db-shadow-md: 0 4px 6px rgba(0, 0, 0, 0.07), 0 2px 4px rgba(0, 0, 0, 0.05);
34
+ --db-shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1), 0 4px 6px rgba(0, 0, 0, 0.05);
35
+ --db-shadow-xl: 0 20px 25px rgba(0, 0, 0, 0.1), 0 10px 10px rgba(0, 0, 0, 0.04);
36
+ --db-shadow-2xl: 0 25px 50px rgba(0, 0, 0, 0.15), 0 12px 24px rgba(0, 0, 0, 0.08);
37
+
38
+ /* 圆角 */
39
+ --db-radius-sm: 6px;
40
+ --db-radius-md: 12px;
41
+ --db-radius-lg: 16px;
42
+ --db-radius-xl: 20px;
43
+ --db-radius-2xl: 24px;
44
+
45
+ /* 间距 */
46
+ --db-spacing-xs: 0.5rem;
47
+ --db-spacing-sm: 0.75rem;
48
+ --db-spacing-md: 1rem;
49
+ --db-spacing-lg: 1.5rem;
50
+ --db-spacing-xl: 2rem;
51
+ --db-spacing-2xl: 3rem;
52
+
53
+ /* 字体 */
54
+ --db-font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
55
+ --db-font-mono: 'SF Mono', Monaco, Inconsolata, 'Roboto Mono', monospace;
56
+ }
57
+
58
+ /* 全局布局 - 现代桌面应用风格 */
59
+ * {
60
+ box-sizing: border-box;
61
+ }
62
+
63
+ body {
64
+ font-family: var(--db-font-family);
65
+ background: var(--db-bg-gradient);
66
+ color: var(--db-dark-color);
67
+ line-height: 1.6;
68
+ -webkit-font-smoothing: antialiased;
69
+ -moz-osx-font-smoothing: grayscale;
70
+ }
71
+
72
+ /* 滚动条现代化 */
73
+ ::-webkit-scrollbar {
74
+ width: 8px;
75
+ height: 8px;
76
+ }
77
+
78
+ ::-webkit-scrollbar-track {
79
+ background: var(--db-gray-light);
80
+ border-radius: var(--db-radius-sm);
81
+ }
82
+
83
+ ::-webkit-scrollbar-thumb {
84
+ background: var(--db-gray-medium);
85
+ border-radius: var(--db-radius-sm);
86
+ transition: background 0.3s ease;
87
+ }
88
+
89
+ ::-webkit-scrollbar-thumb:hover {
90
+ background: var(--db-gray-dark);
91
+ }
92
+
93
+ /* 选择文本样式 */
94
+ ::selection {
95
+ background: rgba(102, 126, 234, 0.2);
96
+ color: var(--db-dark-color);
97
+ }
98
+
99
+ ::-moz-selection {
100
+ background: rgba(102, 126, 234, 0.2);
101
+ color: var(--db-dark-color);
102
+ }
103
+
104
+ /* 现代卡片样式 */
105
+ .card {
106
+ background: var(--db-card-gradient);
107
+ border: 1px solid var(--db-gray-medium);
108
+ border-radius: var(--db-radius-lg);
109
+ box-shadow: var(--db-shadow-md);
110
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
111
+ overflow: hidden;
112
+ backdrop-filter: blur(10px);
113
+ }
114
+
115
+ .card:hover {
116
+ transform: translateY(-4px);
117
+ box-shadow: var(--db-shadow-xl);
118
+ border-color: var(--db-primary-color);
119
+ }
120
+
121
+ .card-header {
122
+ background: linear-gradient(135deg, var(--db-light-color) 0%, var(--db-gray-light) 100%);
123
+ border-bottom: 1px solid var(--db-gray-medium);
124
+ padding: var(--db-spacing-lg);
125
+ font-weight: 700;
126
+ color: var(--db-dark-color);
127
+ position: relative;
128
+ }
129
+
130
+ .card-header::before {
131
+ content: '';
132
+ position: absolute;
133
+ top: 0;
134
+ left: 0;
135
+ width: 4px;
136
+ height: 100%;
137
+ background: var(--db-primary-gradient);
138
+ opacity: 0;
139
+ transition: opacity 0.3s ease;
140
+ }
141
+
142
+ .card:hover .card-header::before {
143
+ opacity: 1;
144
+ }
145
+
146
+ .card-body {
147
+ padding: var(--db-spacing-lg);
148
+ }
149
+
150
+ .card-footer {
151
+ background: var(--db-gray-light);
152
+ border-top: 1px solid var(--db-gray-medium);
153
+ padding: var(--db-spacing-md) var(--db-spacing-lg);
154
+ }
155
+
156
+ /* 现代表格样式 */
157
+ .table {
158
+ background: white;
159
+ border-radius: var(--db-radius-lg);
160
+ overflow: hidden;
161
+ box-shadow: var(--db-shadow-sm);
162
+ }
163
+
164
+ .table th {
165
+ border-top: none;
166
+ font-weight: 700;
167
+ color: var(--db-dark-color);
168
+ background: var(--db-gray-light);
169
+ padding: var(--db-spacing-md) var(--db-spacing-lg);
170
+ letter-spacing: 0.025em;
171
+ text-transform: uppercase;
172
+ font-size: 0.875rem;
173
+ }
174
+
175
+ .table td {
176
+ padding: var(--db-spacing-md) var(--db-spacing-lg);
177
+ border-color: var(--db-gray-medium);
178
+ vertical-align: middle;
179
+ }
180
+
181
+ .table-striped tbody tr:nth-of-type(odd) {
182
+ background-color: rgba(248, 250, 252, 0.5);
183
+ }
184
+
185
+ .table-hover tbody tr:hover {
186
+ background-color: rgba(102, 126, 234, 0.05);
187
+ transform: translateX(2px);
188
+ transition: all 0.3s ease;
189
+ }
190
+
191
+ .table-responsive {
192
+ border-radius: var(--db-radius-lg);
193
+ box-shadow: var(--db-shadow-sm);
194
+ }
195
+
196
+ /* 现代按钮样式 */
197
+ .btn {
198
+ border-radius: var(--db-radius-md);
199
+ font-weight: 600;
200
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
201
+ border: none;
202
+ position: relative;
203
+ overflow: hidden;
204
+ letter-spacing: 0.025em;
205
+ box-shadow: var(--db-shadow-sm);
206
+ }
207
+
208
+ .btn::before {
209
+ content: '';
210
+ position: absolute;
211
+ top: 50%;
212
+ left: 50%;
213
+ width: 0;
214
+ height: 0;
215
+ border-radius: 50%;
216
+ background: rgba(255, 255, 255, 0.2);
217
+ transform: translate(-50%, -50%);
218
+ transition: width 0.6s, height 0.6s;
219
+ }
220
+
221
+ .btn:active::before {
222
+ width: 300px;
223
+ height: 300px;
224
+ }
225
+
226
+ .btn:hover {
227
+ transform: translateY(-2px);
228
+ box-shadow: var(--db-shadow-lg);
229
+ }
230
+
231
+ .btn:active {
232
+ transform: translateY(0);
233
+ }
234
+
235
+ /* 主要按钮 */
236
+ .btn-primary {
237
+ background: var(--db-primary-gradient);
238
+ color: white;
239
+ }
240
+
241
+ .btn-primary:hover {
242
+ background: var(--db-primary-dark);
243
+ color: white;
244
+ }
245
+
246
+ /* 次要按钮 */
247
+ .btn-secondary {
248
+ background: var(--db-gray-light);
249
+ color: var(--db-darker-color);
250
+ border: 1px solid var(--db-gray-medium);
251
+ }
252
+
253
+ .btn-secondary:hover {
254
+ background: var(--db-gray-medium);
255
+ color: var(--db-dark-color);
256
+ }
257
+
258
+ /* 成功按钮 */
259
+ .btn-success {
260
+ background: linear-gradient(135deg, var(--db-accent-color) 0%, #059669 100%);
261
+ color: white;
262
+ }
263
+
264
+ /* 警告按钮 */
265
+ .btn-warning {
266
+ background: linear-gradient(135deg, var(--db-warning-color) 0%, #d97706 100%);
267
+ color: white;
268
+ }
269
+
270
+ /* 危险按钮 */
271
+ .btn-danger {
272
+ background: linear-gradient(135deg, var(--db-danger-color) 0%, #dc2626 100%);
273
+ color: white;
274
+ }
275
+
276
+ /* 信息按钮 */
277
+ .btn-info {
278
+ background: linear-gradient(135deg, var(--db-info-color) 0%, #2563eb 100%);
279
+ color: white;
280
+ }
281
+
282
+ /* 轮廓按钮 */
283
+ .btn-outline-primary {
284
+ background: transparent;
285
+ color: var(--db-primary-color);
286
+ border: 2px solid var(--db-primary-color);
287
+ }
288
+
289
+ .btn-outline-primary:hover {
290
+ background: var(--db-primary-gradient);
291
+ color: white;
292
+ border-color: transparent;
293
+ }
294
+
295
+ /* 按钮组 */
296
+ .btn-group-sm > .btn {
297
+ font-size: 0.875rem;
298
+ padding: 0.5rem var(--db-spacing-md);
299
+ border-radius: var(--db-radius-sm);
300
+ }
301
+
302
+ /* 现代徽章样式 */
303
+ .badge {
304
+ font-size: 0.75rem;
305
+ font-weight: 600;
306
+ border-radius: var(--db-radius-sm);
307
+ padding: 0.25rem 0.75rem;
308
+ letter-spacing: 0.025em;
309
+ text-transform: uppercase;
310
+ box-shadow: var(--db-shadow-sm);
311
+ }
312
+
313
+ .badge.bg-primary {
314
+ background: var(--db-primary-gradient) !important;
315
+ }
316
+
317
+ .badge.bg-success {
318
+ background: linear-gradient(135deg, var(--db-accent-color) 0%, #059669 100%) !important;
319
+ }
320
+
321
+ .badge.bg-warning {
322
+ background: linear-gradient(135deg, var(--db-warning-color) 0%, #d97706 100%) !important;
323
+ }
324
+
325
+ .badge.bg-danger {
326
+ background: linear-gradient(135deg, var(--db-danger-color) 0%, #dc2626 100%) !important;
327
+ }
328
+
329
+ .badge.bg-info {
330
+ background: linear-gradient(135deg, var(--db-info-color) 0%, #2563eb 100%) !important;
331
+ }
332
+
333
+ /* 现代导航样式 */
334
+ .navbar {
335
+ background: var(--db-card-gradient);
336
+ border-bottom: 1px solid var(--db-gray-medium);
337
+ box-shadow: var(--db-shadow-md);
338
+ backdrop-filter: blur(10px);
339
+ }
340
+
341
+ .navbar-brand {
342
+ font-weight: 800;
343
+ font-size: 1.25rem;
344
+ color: var(--db-primary-color);
345
+ text-decoration: none;
346
+ transition: all 0.3s ease;
347
+ display: flex;
348
+ align-items: center;
349
+ gap: var(--db-spacing-sm);
350
+ }
351
+
352
+ .navbar-brand:hover {
353
+ color: var(--db-primary-dark);
354
+ transform: translateX(2px);
355
+ }
356
+
357
+ .navbar-nav .nav-link {
358
+ font-weight: 600;
359
+ border-radius: var(--db-radius-md);
360
+ margin: 0 var(--db-spacing-xs);
361
+ transition: all 0.3s ease;
362
+ position: relative;
363
+ overflow: hidden;
364
+ }
365
+
366
+ .navbar-nav .nav-link::before {
367
+ content: '';
368
+ position: absolute;
369
+ bottom: 0;
370
+ left: 50%;
371
+ width: 0;
372
+ height: 2px;
373
+ background: var(--db-primary-gradient);
374
+ transform: translateX(-50%);
375
+ transition: width 0.3s ease;
376
+ }
377
+
378
+ .navbar-nav .nav-link:hover {
379
+ background-color: rgba(102, 126, 234, 0.1);
380
+ color: var(--db-primary-color);
381
+ }
382
+
383
+ .navbar-nav .nav-link:hover::before {
384
+ width: 80%;
385
+ }
386
+
387
+ .navbar-nav .nav-link.active {
388
+ background: var(--db-primary-gradient);
389
+ color: white;
390
+ font-weight: 700;
391
+ box-shadow: var(--db-shadow-md);
392
+ }
393
+
394
+ .navbar-nav .nav-link.active::before {
395
+ width: 100%;
396
+ }
397
+
398
+ /* 现代模态框样式 */
399
+ .modal-content {
400
+ border: none;
401
+ border-radius: var(--db-radius-xl);
402
+ box-shadow: var(--db-shadow-2xl);
403
+ overflow: hidden;
404
+ backdrop-filter: blur(10px);
405
+ }
406
+
407
+ .modal-header {
408
+ background: var(--db-card-gradient);
409
+ border-bottom: 1px solid var(--db-gray-medium);
410
+ padding: var(--db-spacing-xl);
411
+ position: relative;
412
+ }
413
+
414
+ .modal-header::before {
415
+ content: '';
416
+ position: absolute;
417
+ top: 0;
418
+ left: 0;
419
+ width: 100%;
420
+ height: 4px;
421
+ background: var(--db-primary-gradient);
422
+ }
423
+
424
+ .modal-title {
425
+ font-weight: 700;
426
+ color: var(--db-dark-color);
427
+ font-size: 1.5rem;
428
+ }
429
+
430
+ .modal-body {
431
+ padding: var(--db-spacing-xl);
432
+ max-height: 70vh;
433
+ overflow-y: auto;
434
+ }
435
+
436
+ .modal-footer {
437
+ background: var(--db-gray-light);
438
+ border-top: 1px solid var(--db-gray-medium);
439
+ padding: var(--db-spacing-lg) var(--db-spacing-xl);
440
+ display: flex;
441
+ justify-content: flex-end;
442
+ gap: var(--db-spacing-md);
443
+ }
444
+
445
+ .btn-close {
446
+ background: var(--db-gray-light);
447
+ border: none;
448
+ border-radius: var(--db-radius-md);
449
+ width: 32px;
450
+ height: 32px;
451
+ display: flex;
452
+ align-items: center;
453
+ justify-content: center;
454
+ transition: all 0.3s ease;
455
+ }
456
+
457
+ .btn-close:hover {
458
+ background: var(--db-danger-color);
459
+ color: white;
460
+ transform: rotate(90deg);
461
+ }
462
+
463
+ /* 现代表单样式 */
464
+ .form-control {
465
+ border-radius: var(--db-radius-md);
466
+ border: 2px solid var(--db-gray-medium);
467
+ padding: 0.75rem var(--db-spacing-md);
468
+ font-size: 0.95rem;
469
+ transition: all 0.3s ease;
470
+ background: white;
471
+ font-weight: 500;
472
+ }
473
+
474
+ .form-control:focus {
475
+ outline: none;
476
+ border-color: var(--db-primary-color);
477
+ box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1);
478
+ transform: translateY(-1px);
479
+ }
480
+
481
+ .form-select {
482
+ border-radius: var(--db-radius-md);
483
+ border: 2px solid var(--db-gray-medium);
484
+ padding: 0.75rem var(--db-spacing-md);
485
+ font-size: 0.95rem;
486
+ transition: all 0.3s ease;
487
+ background: white;
488
+ font-weight: 500;
489
+ cursor: pointer;
490
+ }
491
+
492
+ .form-select:focus {
493
+ outline: none;
494
+ border-color: var(--db-primary-color);
495
+ box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1);
496
+ transform: translateY(-1px);
497
+ }
498
+
499
+ .form-label {
500
+ font-weight: 700;
501
+ color: var(--db-dark-color);
502
+ margin-bottom: var(--db-spacing-sm);
503
+ font-size: 0.9rem;
504
+ letter-spacing: 0.025em;
505
+ display: flex;
506
+ align-items: center;
507
+ gap: var(--db-spacing-xs);
508
+ }
509
+
510
+ .form-text {
511
+ font-size: 0.875rem;
512
+ color: var(--db-gray-dark);
513
+ margin-top: var(--db-spacing-xs);
514
+ }
515
+
516
+ .form-check-input {
517
+ width: 1.25rem;
518
+ height: 1.25rem;
519
+ border: 2px solid var(--db-gray-medium);
520
+ border-radius: var(--db-radius-sm);
521
+ cursor: pointer;
522
+ transition: all 0.3s ease;
523
+ accent-color: var(--db-primary-color);
524
+ }
525
+
526
+ .form-check-input:checked {
527
+ background: var(--db-primary-gradient);
528
+ border-color: var(--db-primary-color);
529
+ }
530
+
531
+ .form-check-label {
532
+ font-weight: 500;
533
+ color: var(--db-darker-color);
534
+ cursor: pointer;
535
+ margin-left: var(--db-spacing-sm);
536
+ }
537
+
538
+ /* 代码样式 */
539
+ code {
540
+ background-color: #e9ecef;
541
+ color: #d63384;
542
+ padding: 0.2rem 0.4rem;
543
+ border-radius: 3px;
544
+ font-size: 0.875em;
545
+ }
546
+
547
+ pre {
548
+ background-color: #f8f9fa;
549
+ border: 1px solid #e9ecef;
550
+ border-radius: 6px;
551
+ padding: 1rem;
552
+ margin: 0;
553
+ white-space: pre-wrap;
554
+ word-wrap: break-word;
555
+ }
556
+
557
+ /* 警告框样式 */
558
+ .alert {
559
+ border: none;
560
+ border-radius: 6px;
561
+ font-weight: 500;
562
+ }
563
+
564
+ .alert-success {
565
+ background-color: #d4edda;
566
+ color: #155724;
567
+ }
568
+
569
+ .alert-danger {
570
+ background-color: #f8d7da;
571
+ color: #721c24;
572
+ }
573
+
574
+ .alert-warning {
575
+ background-color: #fff3cd;
576
+ color: #856404;
577
+ }
578
+
579
+ .alert-info {
580
+ background-color: #d1ecf1;
581
+ color: #0c5460;
582
+ }
583
+
584
+ /* 工具提示样式 */
585
+ .tooltip {
586
+ font-size: 0.875rem;
587
+ }
588
+
589
+ /* 下拉菜单样式 */
590
+ .dropdown-menu {
591
+ border: none;
592
+ border-radius: 6px;
593
+ box-shadow: 0 4px 8px rgba(0,0,0,0.15);
594
+ }
595
+
596
+ .dropdown-item {
597
+ border-radius: 4px;
598
+ margin: 2px 4px;
599
+ transition: all 0.2s ease;
600
+ }
601
+
602
+ .dropdown-item:hover {
603
+ background-color: #f8f9fa;
604
+ transform: translateX(2px);
605
+ }
606
+
607
+ /* 列表组样式 */
608
+ .list-group-item {
609
+ border: none;
610
+ border-radius: 6px;
611
+ margin-bottom: 4px;
612
+ transition: all 0.2s ease;
613
+ }
614
+
615
+ .list-group-item:hover {
616
+ background-color: #f8f9fa;
617
+ transform: translateX(4px);
618
+ }
619
+
620
+ /* 页面头部样式 */
621
+ .page-header {
622
+ background: linear-gradient(135deg, var(--db-primary-color) 0%, #0056b3 100%);
623
+ color: white;
624
+ padding: 2rem 0;
625
+ margin-bottom: 2rem;
626
+ }
627
+
628
+ .page-header h1 {
629
+ font-weight: 700;
630
+ margin-bottom: 0.5rem;
631
+ }
632
+
633
+ .page-header p {
634
+ opacity: 0.9;
635
+ font-size: 1.1rem;
636
+ }
637
+
638
+ /* 响应式设计 */
639
+ @media (max-width: 768px) {
640
+ .container-fluid {
641
+ padding-left: 15px;
642
+ padding-right: 15px;
643
+ }
644
+
645
+ .card {
646
+ margin-bottom: 1rem;
647
+ }
648
+
649
+ .btn-group {
650
+ flex-direction: column;
651
+ }
652
+
653
+ .table-responsive {
654
+ font-size: 0.875rem;
655
+ }
656
+ }
657
+
658
+ /* 现代动画效果 */
659
+ @keyframes fadeIn {
660
+ from { opacity: 0; transform: translateY(20px); }
661
+ to { opacity: 1; transform: translateY(0); }
662
+ }
663
+
664
+ @keyframes slideInRight {
665
+ from { opacity: 0; transform: translateX(30px); }
666
+ to { opacity: 1; transform: translateX(0); }
667
+ }
668
+
669
+ @keyframes slideInLeft {
670
+ from { opacity: 0; transform: translateX(-30px); }
671
+ to { opacity: 1; transform: translateX(0); }
672
+ }
673
+
674
+ @keyframes scaleIn {
675
+ from { opacity: 0; transform: scale(0.9); }
676
+ to { opacity: 1; transform: scale(1); }
677
+ }
678
+
679
+ @keyframes float {
680
+ 0%, 100% { transform: translateY(0px); }
681
+ 50% { transform: translateY(-10px); }
682
+ }
683
+
684
+ @keyframes pulse {
685
+ 0%, 100% { opacity: 1; transform: scale(1); }
686
+ 50% { opacity: 0.8; transform: scale(1.05); }
687
+ }
688
+
689
+ @keyframes glow {
690
+ 0%, 100% { box-shadow: 0 0 5px rgba(102, 126, 234, 0.3); }
691
+ 50% { box-shadow: 0 0 20px rgba(102, 126, 234, 0.6); }
692
+ }
693
+
694
+ /* 动画类 */
695
+ .fade-in {
696
+ animation: fadeIn 0.5s ease-out;
697
+ }
698
+
699
+ .slide-in-right {
700
+ animation: slideInRight 0.5s ease-out;
701
+ }
702
+
703
+ .slide-in-left {
704
+ animation: slideInLeft 0.5s ease-out;
705
+ }
706
+
707
+ .scale-in {
708
+ animation: scaleIn 0.3s ease-out;
709
+ }
710
+
711
+ .float-animation {
712
+ animation: float 3s ease-in-out infinite;
713
+ }
714
+
715
+ .pulse-animation {
716
+ animation: pulse 2s ease-in-out infinite;
717
+ }
718
+
719
+ .glow-animation {
720
+ animation: glow 2s ease-in-out infinite;
721
+ }
722
+
723
+ /* 滚动条样式 */
724
+ ::-webkit-scrollbar {
725
+ width: 8px;
726
+ height: 8px;
727
+ }
728
+
729
+ ::-webkit-scrollbar-track {
730
+ background: #f1f1f1;
731
+ border-radius: 4px;
732
+ }
733
+
734
+ ::-webkit-scrollbar-thumb {
735
+ background: #c1c1c1;
736
+ border-radius: 4px;
737
+ }
738
+
739
+ ::-webkit-scrollbar-thumb:hover {
740
+ background: #a8a8a8;
741
+ }
742
+
743
+ /* 加载状态 */
744
+ .loading {
745
+ opacity: 0.6;
746
+ pointer-events: none;
747
+ }
748
+
749
+ .loading::after {
750
+ content: '';
751
+ position: absolute;
752
+ top: 50%;
753
+ left: 50%;
754
+ width: 20px;
755
+ height: 20px;
756
+ margin: -10px 0 0 -10px;
757
+ border: 2px solid #f3f3f3;
758
+ border-top: 2px solid var(--db-primary-color);
759
+ border-radius: 50%;
760
+ animation: spin 1s linear infinite;
761
+ }
762
+
763
+ @keyframes spin {
764
+ 0% { transform: rotate(0deg); }
765
+ 100% { transform: rotate(360deg); }
766
+ }
767
+
768
+ /* 现代状态样式 */
769
+ .status-online {
770
+ color: var(--db-accent-color);
771
+ display: flex;
772
+ align-items: center;
773
+ gap: var(--db-spacing-xs);
774
+ }
775
+
776
+ .status-offline {
777
+ color: var(--db-gray-dark);
778
+ display: flex;
779
+ align-items: center;
780
+ gap: var(--db-spacing-xs);
781
+ }
782
+
783
+ .status-error {
784
+ color: var(--db-danger-color);
785
+ display: flex;
786
+ align-items: center;
787
+ gap: var(--db-spacing-xs);
788
+ }
789
+
790
+ .status-dot {
791
+ width: 8px;
792
+ height: 8px;
793
+ border-radius: 50%;
794
+ background: currentColor;
795
+ animation: pulse 2s ease-in-out infinite;
796
+ }
797
+
798
+ /* 数据库类型样式 */
799
+ .db-icon-mysql {
800
+ color: #00758f;
801
+ background: linear-gradient(135deg, #00758f 0%, #005a70 100%);
802
+ }
803
+ .db-icon-postgres {
804
+ color: #336791;
805
+ background: linear-gradient(135deg, #336791 0%, #2a5278 100%);
806
+ }
807
+ .db-icon-sqlite {
808
+ color: #003b57;
809
+ background: linear-gradient(135deg, #003b57 0%, #002d42 100%);
810
+ }
811
+ .db-icon-mssql {
812
+ color: #cc2927;
813
+ background: linear-gradient(135deg, #cc2927 0%, #a62220 100%);
814
+ }
815
+ .db-icon-oracle {
816
+ color: #f80000;
817
+ background: linear-gradient(135deg, #f80000 0%, #d40000 100%);
818
+ }
819
+
820
+ /* 现代工具类 */
821
+ .text-gradient {
822
+ background: var(--db-primary-gradient);
823
+ -webkit-background-clip: text;
824
+ -webkit-text-fill-color: transparent;
825
+ background-clip: text;
826
+ }
827
+
828
+ .bg-gradient {
829
+ background: var(--db-primary-gradient);
830
+ }
831
+
832
+ .bg-glass {
833
+ background: rgba(255, 255, 255, 0.8);
834
+ backdrop-filter: blur(10px);
835
+ border: 1px solid rgba(255, 255, 255, 0.2);
836
+ }
837
+
838
+ .shadow-soft {
839
+ box-shadow: 0 8px 32px rgba(31, 38, 135, 0.15);
840
+ }
841
+
842
+ .border-gradient {
843
+ border: 1px solid;
844
+ border-image: var(--db-primary-gradient) 1;
845
+ }
846
+
847
+ .hover-lift {
848
+ transition: transform 0.3s ease;
849
+ }
850
+
851
+ .hover-lift:hover {
852
+ transform: translateY(-4px);
853
+ }
854
+
855
+ .hover-scale {
856
+ transition: transform 0.3s ease;
857
+ }
858
+
859
+ .hover-scale:hover {
860
+ transform: scale(1.02);
861
+ }
862
+
863
+ /* 加载状态 */
864
+ .loading-overlay {
865
+ position: absolute;
866
+ top: 0;
867
+ left: 0;
868
+ width: 100%;
869
+ height: 100%;
870
+ background: rgba(255, 255, 255, 0.9);
871
+ display: flex;
872
+ align-items: center;
873
+ justify-content: center;
874
+ z-index: 9999;
875
+ backdrop-filter: blur(2px);
876
+ }
877
+
878
+ .loading-spinner {
879
+ width: 40px;
880
+ height: 40px;
881
+ border: 4px solid var(--db-gray-light);
882
+ border-top: 4px solid var(--db-primary-color);
883
+ border-radius: 50%;
884
+ animation: spin 1s linear infinite;
885
+ }
886
+
887
+ @keyframes spin {
888
+ 0% { transform: rotate(0deg); }
889
+ 100% { transform: rotate(360deg); }
890
+ }
891
+
892
+ /* 响应式工具类 */
893
+ .container-fluid {
894
+ padding-left: var(--db-spacing-lg);
895
+ padding-right: var(--db-spacing-lg);
896
+ }
897
+
898
+ @media (max-width: 768px) {
899
+ .container-fluid {
900
+ padding-left: var(--db-spacing-md);
901
+ padding-right: var(--db-spacing-md);
902
+ }
903
+ }
904
+
905
+ @media (max-width: 480px) {
906
+ .container-fluid {
907
+ padding-left: var(--db-spacing-sm);
908
+ padding-right: var(--db-spacing-sm);
909
+ }
910
+ }
911
+
912
+ /* 暗色模式支持 */
913
+ @media (prefers-color-scheme: dark) {
914
+ :root {
915
+ --db-light-color: #1e293b;
916
+ --db-gray-light: #334155;
917
+ --db-gray-medium: #475569;
918
+ --db-gray-dark: #64748b;
919
+ --db-darker-color: #94a3b8;
920
+ --db-dark-color: #f1f5f9;
921
+ --db-black: #f8fafc;
922
+
923
+ --db-bg-gradient: linear-gradient(135deg, #1e293b 0%, #334155 100%);
924
+ --db-card-gradient: linear-gradient(135deg, #334155 0%, #1e293b 100%);
925
+ }
926
+
927
+ .card {
928
+ border-color: #475569;
929
+ }
930
+
931
+ .form-control,
932
+ .form-select {
933
+ background: #1e293b;
934
+ border-color: #475569;
935
+ color: #f1f5f9;
936
+ }
937
+
938
+ .navbar {
939
+ background: linear-gradient(135deg, #334155 0%, #1e293b 100%);
940
+ }
941
+
942
+ .table {
943
+ background: #1e293b;
944
+ }
945
+
946
+ .table th {
947
+ background: #475569;
948
+ color: #f1f5f9;
949
+ }
950
+ }
951
+ /* 覆盖Bootstrap默认样式 */
952
+ .toast-container[data-v-a1eb4510] {
953
+ z-index: 1100;
954
+ }
955
+ .fade-out[data-v-a1eb4510] {
956
+ animation: fadeOut-a1eb4510 1s forwards;
957
+ }
958
+ @keyframes fadeOut-a1eb4510 {
959
+ 0% { opacity: 1; transform: translateY(0);
960
+ }
961
+ 100% { opacity: 0; transform: translateY(-120%);}
962
+ }
963
+
964
+ .loading-overlay[data-v-48d1b926] {
965
+ position: absolute;
966
+ top: 0;
967
+ left: 0;
968
+ width: 100%;
969
+ height: 100%;
970
+ background-color: rgba(0, 0, 0, 0.3);
971
+ display: flex;
972
+ justify-content: center;
973
+ align-items: center;
974
+ z-index: 1050;
975
+ }
976
+ .loading-spinner[data-v-48d1b926] {
977
+ text-align: center;
978
+ }
979
+
980
+ .modal-dialog[data-v-0f64e462] {
981
+ z-index: var(--bs-modal-zindex);
982
+ max-width:none !important;
983
+ }
984
+ .modal-success .modal-header[data-v-0f64e462] {
985
+ background-color: var(--bs-success);
986
+ color: white;
987
+ }
988
+ .modal-error .modal-header[data-v-0f64e462] {
989
+ background-color: var(--bs-danger);
990
+ color: white;
991
+ }
992
+ .modal-warning .modal-header[data-v-0f64e462] {
993
+ background-color: var(--bs-warning);
994
+ color: var(--bs-dark);
995
+ }
996
+ .modal-info .modal-header[data-v-0f64e462] {
997
+ background-color: var(--bs-info);
998
+ color: white;
999
+ }
1000
+ .modal-body[data-v-0f64e462] {
1001
+ min-height: 80px;
1002
+ display: flex;
1003
+ flex-direction: column;
1004
+ align-items: stretch;
1005
+ }
1006
+ .error-details[data-v-0f64e462] {
1007
+ width: 100%;
1008
+ margin-top: 1rem;
1009
+ }
1010
+ .error-content[data-v-0f64e462] {
1011
+ background-color: #f8f9fa;
1012
+ border: 1px solid #e9ecef;
1013
+ border-radius: 0.375rem;
1014
+ padding: 1rem;
1015
+ margin: 0;
1016
+ max-height: 200px;
1017
+ overflow-y: auto;
1018
+ white-space: pre-wrap;
1019
+ word-break: break-word;
1020
+ font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
1021
+ font-size: 0.875rem;
1022
+ line-height: 1.5;
1023
+ }
1024
+ .error-details-toggle[data-v-0f64e462] {
1025
+ width: 100%;
1026
+ }
1027
+ .error-details-content[data-v-0f64e462] {
1028
+ background-color: #f8f9fa;
1029
+ border: 1px solid #e9ecef;
1030
+ border-radius: 0.375rem;
1031
+ padding: 1rem;
1032
+ margin-top: 0.5rem;
1033
+ }
1034
+ .error-json[data-v-0f64e462] {
1035
+ background-color: #212529;
1036
+ color: #f8f9fa;
1037
+ border-radius: 0.25rem;
1038
+ padding: 0.75rem;
1039
+ font-size: 0.8rem;
1040
+ line-height: 1.4;
1041
+ max-height: 300px;
1042
+ overflow-y: auto;
1043
+ white-space: pre-wrap;
1044
+ word-break: break-word;
1045
+ }
1046
+ .error-meta[data-v-0f64e462] {
1047
+ border-bottom: 1px solid #dee2e6;
1048
+ padding-bottom: 0.5rem;
1049
+ margin-bottom: 0.5rem;
1050
+ }
1051
+ .modal-body .fs-1[data-v-0f64e462] {
1052
+ font-size: 2.5rem;
1053
+ margin-bottom: 1rem;
1054
+ }
1055
+
1056
+ /* 响应式调整 */
1057
+ @media (max-width: 576px) {
1058
+ .error-content[data-v-0f64e462],
1059
+ .error-json[data-v-0f64e462] {
1060
+ font-size: 0.75rem;
1061
+ max-height: 150px;
1062
+ }
1063
+ }
1064
+
1065
+ .datagrid-inner[data-v-f1c2cf28] {
1066
+ overflow: auto;
1067
+ margin-bottom: 10px;
1068
+ }
1069
+ .datagrid-th[data-v-f1c2cf28] {
1070
+ min-width: 80px;
1071
+ }