fdb2 1.0.13 → 1.0.14

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