fdb2 1.0.7 → 1.0.9

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 (234) hide show
  1. package/.dockerignore +21 -21
  2. package/.editorconfig +11 -11
  3. package/.eslintrc.cjs +14 -14
  4. package/.eslintrc.json +7 -7
  5. package/.prettierrc.js +3 -3
  6. package/.tpl.env +21 -21
  7. package/.vscodeignore +45 -45
  8. package/README.md +312 -312
  9. package/bin/build.sh +28 -28
  10. package/bin/deploy.sh +8 -8
  11. package/bin/dev.sh +10 -10
  12. package/bin/docker/dev-docker-compose.yml +43 -43
  13. package/bin/docker/dev.Dockerfile +24 -24
  14. package/bin/docker/prod-docker-compose.yml +17 -17
  15. package/bin/docker/prod.Dockerfile +29 -29
  16. package/bin/fdb2.js +220 -220
  17. package/dist/package.json +29 -29
  18. package/dist/pnpm-lock.yaml +1042 -354
  19. package/dist/public/explorer.css +1464 -1437
  20. package/dist/public/explorer.js +764 -226
  21. package/dist/public/index.css +1026 -1026
  22. package/dist/public/index.js +15 -9
  23. package/dist/public/layout.css +221 -221
  24. package/dist/public/layout.js +1 -1
  25. package/dist/public/vue.js +8 -2
  26. package/dist/scripts/preinstall.js +112 -112
  27. package/dist/server/index.d.ts.map +1 -1
  28. package/dist/server/index.js +8 -0
  29. package/dist/server/index.js.map +1 -1
  30. package/dist/server/index.ts +680 -671
  31. package/dist/server/model/connection.entity.ts +65 -65
  32. package/dist/server/model/database.entity.ts +245 -245
  33. package/dist/server/service/connection.service.d.ts +6 -1
  34. package/dist/server/service/connection.service.d.ts.map +1 -1
  35. package/dist/server/service/connection.service.js +15 -0
  36. package/dist/server/service/connection.service.js.map +1 -1
  37. package/dist/server/service/connection.service.ts +356 -341
  38. package/dist/server/service/database/base.service.d.ts +27 -0
  39. package/dist/server/service/database/base.service.d.ts.map +1 -1
  40. package/dist/server/service/database/base.service.js +17 -0
  41. package/dist/server/service/database/base.service.js.map +1 -1
  42. package/dist/server/service/database/base.service.ts +406 -367
  43. package/dist/server/service/database/cockroachdb.service.d.ts +16 -0
  44. package/dist/server/service/database/cockroachdb.service.d.ts.map +1 -1
  45. package/dist/server/service/database/cockroachdb.service.js +220 -154
  46. package/dist/server/service/database/cockroachdb.service.js.map +1 -1
  47. package/dist/server/service/database/cockroachdb.service.ts +871 -782
  48. package/dist/server/service/database/database.service.d.ts +4 -0
  49. package/dist/server/service/database/database.service.d.ts.map +1 -1
  50. package/dist/server/service/database/database.service.js +123 -0
  51. package/dist/server/service/database/database.service.js.map +1 -1
  52. package/dist/server/service/database/database.service.ts +775 -638
  53. package/dist/server/service/database/index.ts +6 -6
  54. package/dist/server/service/database/mongodb.service.d.ts +16 -0
  55. package/dist/server/service/database/mongodb.service.d.ts.map +1 -1
  56. package/dist/server/service/database/mongodb.service.js +35 -0
  57. package/dist/server/service/database/mongodb.service.js.map +1 -1
  58. package/dist/server/service/database/mongodb.service.ts +39 -1
  59. package/dist/server/service/database/mssql.service.d.ts +16 -0
  60. package/dist/server/service/database/mssql.service.d.ts.map +1 -1
  61. package/dist/server/service/database/mssql.service.js +168 -96
  62. package/dist/server/service/database/mssql.service.js.map +1 -1
  63. package/dist/server/service/database/mssql.service.ts +931 -840
  64. package/dist/server/service/database/mysql.service.d.ts +16 -0
  65. package/dist/server/service/database/mysql.service.d.ts.map +1 -1
  66. package/dist/server/service/database/mysql.service.js +189 -80
  67. package/dist/server/service/database/mysql.service.js.map +1 -1
  68. package/dist/server/service/database/mysql.service.ts +1025 -890
  69. package/dist/server/service/database/oracle.service.d.ts +16 -0
  70. package/dist/server/service/database/oracle.service.d.ts.map +1 -1
  71. package/dist/server/service/database/oracle.service.js +182 -120
  72. package/dist/server/service/database/oracle.service.js.map +1 -1
  73. package/dist/server/service/database/oracle.service.ts +1035 -959
  74. package/dist/server/service/database/postgres.service.d.ts +16 -0
  75. package/dist/server/service/database/postgres.service.d.ts.map +1 -1
  76. package/dist/server/service/database/postgres.service.js +154 -88
  77. package/dist/server/service/database/postgres.service.js.map +1 -1
  78. package/dist/server/service/database/postgres.service.ts +960 -871
  79. package/dist/server/service/database/sap.service.d.ts +16 -0
  80. package/dist/server/service/database/sap.service.d.ts.map +1 -1
  81. package/dist/server/service/database/sap.service.js +66 -0
  82. package/dist/server/service/database/sap.service.js.map +1 -1
  83. package/dist/server/service/database/sap.service.ts +89 -0
  84. package/dist/server/service/database/sqlite.service.d.ts +16 -0
  85. package/dist/server/service/database/sqlite.service.d.ts.map +1 -1
  86. package/dist/server/service/database/sqlite.service.js +77 -18
  87. package/dist/server/service/database/sqlite.service.js.map +1 -1
  88. package/dist/server/service/database/sqlite.service.ts +787 -708
  89. package/dist/server/service/session.service.ts +158 -158
  90. package/dist/view/index.html +38 -38
  91. package/env.d.ts +1 -1
  92. package/package.json +1 -1
  93. package/packages/vscode/.vscodeignore +44 -44
  94. package/packages/vscode/README.md +62 -62
  95. package/packages/vscode/out/database-services/cockroachdb.service.js +154 -154
  96. package/packages/vscode/out/database-services/mssql.service.js +96 -96
  97. package/packages/vscode/out/database-services/mysql.service.js +80 -80
  98. package/packages/vscode/out/database-services/oracle.service.js +120 -120
  99. package/packages/vscode/out/database-services/postgres.service.js +88 -88
  100. package/packages/vscode/out/database-services/sqlite.service.js +18 -18
  101. package/packages/vscode/out/provider/WebViewProvider.js +32 -32
  102. package/packages/vscode/package.json +142 -142
  103. package/packages/vscode/resources/icon.svg +5 -5
  104. package/packages/vscode/resources/webview/connection.css +41 -41
  105. package/packages/vscode/resources/webview/database.css +163 -163
  106. package/packages/vscode/resources/webview/index.html +9 -9
  107. package/packages/vscode/resources/webview/modules/header.tpl +13 -13
  108. package/packages/vscode/resources/webview/modules/initial_state.tpl +54 -54
  109. package/packages/vscode/resources/webview/query.css +104 -104
  110. package/packages/vscode/src/database-services/base.service.ts +362 -362
  111. package/packages/vscode/src/database-services/cockroachdb.service.ts +659 -659
  112. package/packages/vscode/src/database-services/connection.service.ts +340 -340
  113. package/packages/vscode/src/database-services/database.service.ts +629 -629
  114. package/packages/vscode/src/database-services/index.ts +6 -6
  115. package/packages/vscode/src/database-services/model/connection.entity.ts +65 -65
  116. package/packages/vscode/src/database-services/model/database.entity.ts +245 -245
  117. package/packages/vscode/src/database-services/mssql.service.ts +722 -722
  118. package/packages/vscode/src/database-services/mysql.service.ts +760 -760
  119. package/packages/vscode/src/database-services/oracle.service.ts +831 -831
  120. package/packages/vscode/src/database-services/postgres.service.ts +740 -740
  121. package/packages/vscode/src/database-services/sqlite.service.ts +558 -558
  122. package/packages/vscode/src/extension.ts +76 -76
  123. package/packages/vscode/src/provider/DatabaseTreeProvider.ts +167 -167
  124. package/packages/vscode/src/provider/WebViewProvider.ts +277 -277
  125. package/packages/vscode/src/service/DatabaseServiceBridge.ts +414 -414
  126. package/packages/vscode/src/typings/connection.ts +90 -90
  127. package/packages/vscode/tsconfig.json +21 -21
  128. package/public/index.html +9 -9
  129. package/public/modules/header.tpl +13 -13
  130. package/public/modules/initial_state.tpl +54 -54
  131. package/scripts/preinstall.js +112 -112
  132. package/server/index.ts +680 -671
  133. package/server/model/connection.entity.ts +65 -65
  134. package/server/model/database.entity.ts +245 -245
  135. package/server/service/connection.service.ts +356 -341
  136. package/server/service/database/base.service.ts +406 -367
  137. package/server/service/database/cockroachdb.service.ts +871 -782
  138. package/server/service/database/database.service.ts +775 -638
  139. package/server/service/database/index.ts +6 -6
  140. package/server/service/database/mongodb.service.ts +39 -1
  141. package/server/service/database/mssql.service.ts +931 -840
  142. package/server/service/database/mysql.service.ts +1025 -890
  143. package/server/service/database/oracle.service.ts +1035 -959
  144. package/server/service/database/postgres.service.ts +960 -871
  145. package/server/service/database/sap.service.ts +89 -0
  146. package/server/service/database/sqlite.service.ts +787 -708
  147. package/server/service/session.service.ts +158 -158
  148. package/server/tsconfig.json +20 -20
  149. package/server.js +149 -149
  150. package/server.pid +1 -0
  151. package/src/adapter/ajax.ts +135 -135
  152. package/src/assets/base.css +1 -1
  153. package/src/assets/database.css +949 -949
  154. package/src/assets/images/svg/illustrations/illustration-1.svg +1 -1
  155. package/src/assets/images/svg/illustrations/illustration-2.svg +2 -2
  156. package/src/assets/images/svg/illustrations/illustration-3.svg +50 -50
  157. package/src/assets/images/svg/illustrations/illustration-4.svg +1 -1
  158. package/src/assets/images/svg/illustrations/illustration-5.svg +73 -73
  159. package/src/assets/images/svg/illustrations/illustration-6.svg +89 -89
  160. package/src/assets/images/svg/illustrations/illustration-7.svg +39 -39
  161. package/src/assets/images/svg/separators/curve-2.svg +3 -3
  162. package/src/assets/images/svg/separators/curve.svg +3 -3
  163. package/src/assets/images/svg/separators/line.svg +3 -3
  164. package/src/assets/logo.svg +73 -73
  165. package/src/assets/main.css +1 -1
  166. package/src/base/config.ts +20 -20
  167. package/src/base/detect.ts +134 -134
  168. package/src/base/entity.ts +92 -92
  169. package/src/base/eventBus.ts +36 -36
  170. package/src/components/connection-editor/index.vue +588 -588
  171. package/src/components/dataGrid/index.vue +104 -104
  172. package/src/components/dataGrid/pagination.vue +105 -105
  173. package/src/components/loading/index.vue +42 -42
  174. package/src/components/modal/index.ts +180 -180
  175. package/src/components/modal/index.vue +560 -560
  176. package/src/components/toast/index.ts +43 -43
  177. package/src/components/toast/toast.vue +57 -57
  178. package/src/components/user/name.vue +103 -103
  179. package/src/components/user/selector.vue +416 -416
  180. package/src/domain/SysConfig.ts +74 -74
  181. package/src/platform/App.vue +7 -7
  182. package/src/platform/database/components/connection-detail.vue +1153 -1154
  183. package/src/platform/database/components/data-editor.vue +477 -477
  184. package/src/platform/database/components/database-detail.vue +1173 -1172
  185. package/src/platform/database/components/database-monitor.vue +1085 -1085
  186. package/src/platform/database/components/db-tools.vue +1264 -816
  187. package/src/platform/database/components/query-history.vue +1348 -1348
  188. package/src/platform/database/components/sql-executor.vue +737 -737
  189. package/src/platform/database/components/sql-query-editor.vue +1045 -1045
  190. package/src/platform/database/components/table-detail.vue +1375 -1376
  191. package/src/platform/database/components/table-editor.vue +916 -916
  192. package/src/platform/database/explorer.vue +1839 -1839
  193. package/src/platform/database/index.vue +1192 -1192
  194. package/src/platform/database/layout.vue +366 -366
  195. package/src/platform/database/router.ts +36 -36
  196. package/src/platform/database/styles/common.scss +601 -601
  197. package/src/platform/database/types/common.ts +444 -444
  198. package/src/platform/database/utils/export.ts +231 -231
  199. package/src/platform/database/utils/helpers.ts +436 -436
  200. package/src/platform/index.ts +32 -32
  201. package/src/platform/router.ts +40 -40
  202. package/src/platform/vscode/bridge.ts +121 -121
  203. package/src/platform/vscode/components/ConnectionPanel.vue +272 -272
  204. package/src/platform/vscode/components/DatabasePanel.vue +532 -532
  205. package/src/platform/vscode/components/QueryPanel.vue +371 -371
  206. package/src/platform/vscode/entry/connection.ts +13 -13
  207. package/src/platform/vscode/entry/database.ts +13 -13
  208. package/src/platform/vscode/entry/query.ts +13 -13
  209. package/src/platform/vscode/index.ts +5 -5
  210. package/src/service/base.ts +133 -127
  211. package/src/service/database.ts +505 -495
  212. package/src/service/login.ts +120 -120
  213. package/src/shims-vue.d.ts +6 -6
  214. package/src/stores/connection.ts +266 -266
  215. package/src/stores/session.ts +87 -87
  216. package/src/typings/database-types.ts +412 -412
  217. package/src/typings/database.ts +363 -363
  218. package/src/typings/global.d.ts +58 -58
  219. package/src/typings/pinia.d.ts +7 -7
  220. package/src/utils/clipboard.ts +29 -29
  221. package/src/utils/database-types.ts +242 -242
  222. package/src/utils/modal.ts +123 -123
  223. package/src/utils/request.ts +55 -55
  224. package/src/utils/sleep.ts +3 -3
  225. package/src/utils/toast.ts +73 -73
  226. package/src/utils/util.ts +171 -171
  227. package/src/utils/xlsx.ts +228 -228
  228. package/tsconfig.json +33 -33
  229. package/view/index.html +9 -9
  230. package/view/modules/header.tpl +13 -13
  231. package/view/modules/initial_state.tpl +19 -19
  232. package/vite.config.ts +424 -424
  233. package/vite.config.vscode.ts +47 -47
  234. package/server/backups/db_ai_breakout_2026-03-11T08-38-48-677Z.sql +0 -0
@@ -1,1071 +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
- }
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
951
  /* 覆盖Bootstrap默认样式 */
952
- .toast-container[data-v-a1eb4510] {
952
+ .toast-container[data-v-7d639c44] {
953
953
  z-index: 1100;
954
954
  }
955
- .fade-out[data-v-a1eb4510] {
956
- animation: fadeOut-a1eb4510 1s forwards;
955
+ .fade-out[data-v-7d639c44] {
956
+ animation: fadeOut-7d639c44 1s forwards;
957
957
  }
958
- @keyframes fadeOut-a1eb4510 {
958
+ @keyframes fadeOut-7d639c44 {
959
959
  0% { opacity: 1; transform: translateY(0);
960
960
  }
961
961
  100% { opacity: 0; transform: translateY(-120%);}
962
- }
962
+ }
963
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;
964
+ .loading-overlay[data-v-d5892680] {
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
974
  z-index: 1050;
975
975
  }
976
- .loading-spinner[data-v-48d1b926] {
976
+ .loading-spinner[data-v-d5892680] {
977
977
  text-align: center;
978
- }
978
+ }
979
979
 
980
- .modal-dialog[data-v-0f64e462] {
981
- z-index: var(--bs-modal-zindex);
980
+ .modal-dialog[data-v-6653cff9] {
981
+ z-index: var(--bs-modal-zindex);
982
982
  max-width:none !important;
983
983
  }
984
- .modal-success .modal-header[data-v-0f64e462] {
985
- background-color: var(--bs-success);
984
+ .modal-success .modal-header[data-v-6653cff9] {
985
+ background-color: var(--bs-success);
986
986
  color: white;
987
987
  }
988
- .modal-error .modal-header[data-v-0f64e462] {
989
- background-color: var(--bs-danger);
988
+ .modal-error .modal-header[data-v-6653cff9] {
989
+ background-color: var(--bs-danger);
990
990
  color: white;
991
991
  }
992
- .modal-warning .modal-header[data-v-0f64e462] {
993
- background-color: var(--bs-warning);
992
+ .modal-warning .modal-header[data-v-6653cff9] {
993
+ background-color: var(--bs-warning);
994
994
  color: var(--bs-dark);
995
995
  }
996
- .modal-info .modal-header[data-v-0f64e462] {
997
- background-color: var(--bs-info);
996
+ .modal-info .modal-header[data-v-6653cff9] {
997
+ background-color: var(--bs-info);
998
998
  color: white;
999
999
  }
1000
- .modal-body[data-v-0f64e462] {
1001
- min-height: 80px;
1002
- display: flex;
1003
- flex-direction: column;
1000
+ .modal-body[data-v-6653cff9] {
1001
+ min-height: 80px;
1002
+ display: flex;
1003
+ flex-direction: column;
1004
1004
  align-items: stretch;
1005
1005
  }
1006
- .error-details[data-v-0f64e462] {
1007
- width: 100%;
1006
+ .error-details[data-v-6653cff9] {
1007
+ width: 100%;
1008
1008
  margin-top: 1rem;
1009
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;
1010
+ .error-content[data-v-6653cff9] {
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
1022
  line-height: 1.5;
1023
1023
  }
1024
- .error-details-toggle[data-v-0f64e462] {
1024
+ .error-details-toggle[data-v-6653cff9] {
1025
1025
  width: 100%;
1026
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;
1027
+ .error-details-content[data-v-6653cff9] {
1028
+ background-color: #f8f9fa;
1029
+ border: 1px solid #e9ecef;
1030
+ border-radius: 0.375rem;
1031
+ padding: 1rem;
1032
1032
  margin-top: 0.5rem;
1033
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;
1034
+ .error-json[data-v-6653cff9] {
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
1044
  word-break: break-word;
1045
1045
  }
1046
- .error-meta[data-v-0f64e462] {
1047
- border-bottom: 1px solid #dee2e6;
1048
- padding-bottom: 0.5rem;
1046
+ .error-meta[data-v-6653cff9] {
1047
+ border-bottom: 1px solid #dee2e6;
1048
+ padding-bottom: 0.5rem;
1049
1049
  margin-bottom: 0.5rem;
1050
1050
  }
1051
- .modal-body .fs-1[data-v-0f64e462] {
1052
- font-size: 2.5rem;
1051
+ .modal-body .fs-1[data-v-6653cff9] {
1052
+ font-size: 2.5rem;
1053
1053
  margin-bottom: 1rem;
1054
- }
1055
-
1054
+ }
1055
+
1056
1056
  /* 响应式调整 */
1057
1057
  @media (max-width: 576px) {
1058
- .error-content[data-v-0f64e462],
1059
- .error-json[data-v-0f64e462] {
1060
- font-size: 0.75rem;
1058
+ .error-content[data-v-6653cff9],
1059
+ .error-json[data-v-6653cff9] {
1060
+ font-size: 0.75rem;
1061
1061
  max-height: 150px;
1062
1062
  }
1063
- }
1063
+ }
1064
1064
 
1065
- .datagrid-inner[data-v-f1c2cf28] {
1066
- overflow: auto;
1065
+ .datagrid-inner[data-v-9bff1755] {
1066
+ overflow: auto;
1067
1067
  margin-bottom: 10px;
1068
1068
  }
1069
- .datagrid-th[data-v-f1c2cf28] {
1069
+ .datagrid-th[data-v-9bff1755] {
1070
1070
  min-width: 80px;
1071
- }
1071
+ }