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,367 +1,367 @@
1
- <template>
2
- <div class="database-layout">
3
- <!-- 主要内容区域 -->
4
- <main class="main-content-modern">
5
- <div class="content-wrapper">
6
- <router-view />
7
- </div>
8
- </main>
9
- </div>
10
- </template>
11
-
12
- <script lang="ts" setup>
13
- // 空的script标签用于保持组件结构
14
- </script>
15
-
16
- <style scoped>
17
- /* 主布局样式 */
18
- .database-layout {
19
- height: 100vh;
20
- display: flex;
21
- flex-direction: column;
22
- background: linear-gradient(135deg, #f8fafc 0%, #e2e8f0 100%);
23
- }
24
-
25
- /* 现代导航栏样式 */
26
- .navbar-modern {
27
- background: linear-gradient(135deg, #ffffff 0%, #f8fafc 100%);
28
- border-bottom: 1px solid #e2e8f0;
29
- box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
30
- padding: 0.75rem 0;
31
- position: sticky;
32
- top: 0;
33
- z-index: 1030;
34
- backdrop-filter: blur(10px);
35
- }
36
-
37
- /* 品牌区域 */
38
- .navbar-brand-wrapper {
39
- margin-right: 2rem;
40
- }
41
-
42
- .navbar-brand-modern {
43
- display: flex;
44
- align-items: center;
45
- gap: 1rem;
46
- text-decoration: none;
47
- color: #1e293b;
48
- transition: all 0.3s ease;
49
- }
50
-
51
- .navbar-brand-modern:hover {
52
- color: #667eea;
53
- transform: translateX(2px);
54
- }
55
-
56
- .brand-icon {
57
- width: 45px;
58
- height: 45px;
59
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
60
- border-radius: 12px;
61
- display: flex;
62
- align-items: center;
63
- justify-content: center;
64
- color: white;
65
- font-size: 1.5rem;
66
- box-shadow: 0 4px 12px rgba(102, 126, 234, 0.3);
67
- transition: all 0.3s ease;
68
- }
69
-
70
- .brand-icon:hover {
71
- transform: rotate(5deg) scale(1.05);
72
- box-shadow: 0 6px 16px rgba(102, 126, 234, 0.4);
73
- }
74
-
75
- .brand-text {
76
- display: flex;
77
- flex-direction: column;
78
- gap: 2px;
79
- }
80
-
81
- .brand-name {
82
- font-size: 1.25rem;
83
- font-weight: 700;
84
- color: #1e293b;
85
- letter-spacing: -0.025em;
86
- }
87
-
88
- .brand-subtitle {
89
- font-size: 0.75rem;
90
- color: #64748b;
91
- font-weight: 500;
92
- letter-spacing: 0.05em;
93
- text-transform: uppercase;
94
- }
95
-
96
- /* 移动端切换按钮 */
97
- .navbar-toggler-modern {
98
- background: none;
99
- border: none;
100
- padding: 0.5rem;
101
- cursor: pointer;
102
- display: none;
103
- flex-direction: column;
104
- gap: 4px;
105
- }
106
-
107
- .navbar-toggler-line {
108
- width: 25px;
109
- height: 3px;
110
- background: linear-gradient(90deg, #667eea, #764ba2);
111
- border-radius: 2px;
112
- transition: all 0.3s ease;
113
- }
114
-
115
- /* 导航折叠区域 */
116
- .navbar-collapse-modern {
117
- background: transparent;
118
- }
119
-
120
- /* 主导航样式 */
121
- .navbar-nav-modern {
122
- display: flex;
123
- align-items: center;
124
- gap: 0.5rem;
125
- }
126
-
127
- .nav-item-modern {
128
- position: relative;
129
- }
130
-
131
- .nav-link-modern {
132
- display: flex;
133
- align-items: center;
134
- gap: 0.75rem;
135
- padding: 0.75rem 1.25rem;
136
- border-radius: 12px;
137
- color: #64748b;
138
- text-decoration: none;
139
- font-weight: 500;
140
- transition: all 0.3s ease;
141
- position: relative;
142
- overflow: hidden;
143
- }
144
-
145
- .nav-link-modern:hover {
146
- background: rgba(102, 126, 234, 0.1);
147
- color: #667eea;
148
- transform: translateY(-1px);
149
- }
150
-
151
- .nav-link-modern.active {
152
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
153
- color: white;
154
- box-shadow: 0 4px 12px rgba(102, 126, 234, 0.3);
155
- }
156
-
157
- .nav-icon {
158
- font-size: 1.25rem;
159
- display: flex;
160
- align-items: center;
161
- justify-content: center;
162
- min-width: 24px;
163
- }
164
-
165
- .nav-text {
166
- font-size: 0.95rem;
167
- font-weight: 600;
168
- letter-spacing: 0.025em;
169
- }
170
-
171
- .nav-indicator {
172
- position: absolute;
173
- bottom: 0;
174
- left: 50%;
175
- transform: translateX(-50%);
176
- width: 4px;
177
- height: 4px;
178
- background: white;
179
- border-radius: 50%;
180
- opacity: 0;
181
- transition: all 0.3s ease;
182
- }
183
-
184
- .nav-link-modern.active .nav-indicator {
185
- opacity: 1;
186
- }
187
-
188
- /* 用户菜单样式 */
189
- .nav-icon-only {
190
- padding: 0.75rem;
191
- min-width: auto;
192
- }
193
-
194
- .notification-dot {
195
- position: absolute;
196
- top: 8px;
197
- right: 8px;
198
- width: 8px;
199
- height: 8px;
200
- background: #ef4444;
201
- border-radius: 50%;
202
- border: 2px solid white;
203
- animation: pulse 2s ease-in-out infinite;
204
- }
205
-
206
- .user-menu-toggle {
207
- display: flex;
208
- align-items: center;
209
- gap: 0.75rem;
210
- padding: 0.5rem;
211
- border-radius: 12px;
212
- transition: all 0.3s ease;
213
- }
214
-
215
- .user-menu-toggle:hover {
216
- background: rgba(102, 126, 234, 0.1);
217
- }
218
-
219
- .user-avatar {
220
- width: 40px;
221
- height: 40px;
222
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
223
- border-radius: 50%;
224
- display: flex;
225
- align-items: center;
226
- justify-content: center;
227
- color: white;
228
- font-size: 1.25rem;
229
- box-shadow: 0 2px 8px rgba(102, 126, 234, 0.3);
230
- }
231
-
232
- .user-info {
233
- display: flex;
234
- flex-direction: column;
235
- gap: 2px;
236
- }
237
-
238
- .user-name {
239
- font-size: 0.9rem;
240
- font-weight: 600;
241
- color: #1e293b;
242
- }
243
-
244
- .user-role {
245
- font-size: 0.75rem;
246
- color: #64748b;
247
- font-weight: 500;
248
- }
249
-
250
- .dropdown-arrow {
251
- color: #94a3b8;
252
- font-size: 0.75rem;
253
- transition: all 0.3s ease;
254
- }
255
-
256
- .user-menu-toggle:hover .dropdown-arrow {
257
- color: #667eea;
258
- transform: translateY(1px);
259
- }
260
-
261
- /* 现代下拉菜单样式 */
262
- .dropdown-menu-modern {
263
- background: white;
264
- border: 1px solid #e2e8f0;
265
- border-radius: 16px;
266
- box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1), 0 4px 10px rgba(0, 0, 0, 0.05);
267
- padding: 0.75rem;
268
- min-width: 280px;
269
- backdrop-filter: blur(10px);
270
- margin-top: 0.75rem;
271
- }
272
-
273
- .dropdown-header {
274
- padding: 0.5rem 0.75rem;
275
- font-size: 0.75rem;
276
- font-weight: 700;
277
- color: #94a3b8;
278
- text-transform: uppercase;
279
- letter-spacing: 0.05em;
280
- border-bottom: 1px solid #f1f5f9;
281
- margin-bottom: 0.5rem;
282
- }
283
-
284
- .dropdown-item-modern {
285
- display: flex;
286
- align-items: center;
287
- gap: 0.75rem;
288
- padding: 0.75rem;
289
- border-radius: 8px;
290
- color: #374151;
291
- text-decoration: none;
292
- transition: all 0.2s ease;
293
- margin-bottom: 2px;
294
- }
295
-
296
- .dropdown-item-modern:hover {
297
- background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);
298
- color: #667eea;
299
- transform: translateX(4px);
300
- }
301
-
302
- .dropdown-item-modern.text-danger:hover {
303
- background: linear-gradient(135deg, #fef2f2 0%, #fee2e2 100%);
304
- color: #dc2626;
305
- }
306
-
307
- .dropdown-item-content {
308
- display: flex;
309
- flex-direction: column;
310
- gap: 2px;
311
- }
312
-
313
- .dropdown-item-title {
314
- font-size: 0.9rem;
315
- font-weight: 600;
316
- color: inherit;
317
- }
318
-
319
- .dropdown-item-desc {
320
- font-size: 0.75rem;
321
- color: #94a3b8;
322
- }
323
-
324
- .dropdown-divider-modern {
325
- margin: 0.75rem -0.75rem;
326
- border: none;
327
- border-top: 1px solid #f1f5f9;
328
- }
329
-
330
- /* 主要内容区域 */
331
- .main-content-modern {
332
- flex: 1;
333
- display: flex;
334
- flex-direction: column;
335
- background: transparent;
336
- overflow: hidden;
337
- }
338
-
339
- .content-wrapper {
340
- flex: 1;
341
- background: rgba(255, 255, 255, 0.3);
342
- backdrop-filter: blur(8px);
343
- overflow-y: auto;
344
- height: 100%;
345
- }
346
-
347
-
348
-
349
- /* 动画效果 */
350
- @keyframes pulse {
351
- 0%, 100% { opacity: 1; transform: scale(1); }
352
- 50% { opacity: 0.6; transform: scale(1.2); }
353
- }
354
-
355
- /* 响应式设计 */
356
- @media (max-width: 768px) {
357
- .content-wrapper {
358
- padding: 0.5rem;
359
- }
360
- }
361
-
362
- @media (max-width: 480px) {
363
- .content-wrapper {
364
- padding: 0.25rem;
365
- }
366
- }
1
+ <template>
2
+ <div class="database-layout">
3
+ <!-- 主要内容区域 -->
4
+ <main class="main-content-modern">
5
+ <div class="content-wrapper">
6
+ <router-view />
7
+ </div>
8
+ </main>
9
+ </div>
10
+ </template>
11
+
12
+ <script lang="ts" setup>
13
+ // 空的script标签用于保持组件结构
14
+ </script>
15
+
16
+ <style scoped>
17
+ /* 主布局样式 */
18
+ .database-layout {
19
+ height: 100vh;
20
+ display: flex;
21
+ flex-direction: column;
22
+ background: linear-gradient(135deg, #f8fafc 0%, #e2e8f0 100%);
23
+ }
24
+
25
+ /* 现代导航栏样式 */
26
+ .navbar-modern {
27
+ background: linear-gradient(135deg, #ffffff 0%, #f8fafc 100%);
28
+ border-bottom: 1px solid #e2e8f0;
29
+ box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
30
+ padding: 0.75rem 0;
31
+ position: sticky;
32
+ top: 0;
33
+ z-index: 1030;
34
+ backdrop-filter: blur(10px);
35
+ }
36
+
37
+ /* 品牌区域 */
38
+ .navbar-brand-wrapper {
39
+ margin-right: 2rem;
40
+ }
41
+
42
+ .navbar-brand-modern {
43
+ display: flex;
44
+ align-items: center;
45
+ gap: 1rem;
46
+ text-decoration: none;
47
+ color: #1e293b;
48
+ transition: all 0.3s ease;
49
+ }
50
+
51
+ .navbar-brand-modern:hover {
52
+ color: #667eea;
53
+ transform: translateX(2px);
54
+ }
55
+
56
+ .brand-icon {
57
+ width: 45px;
58
+ height: 45px;
59
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
60
+ border-radius: 12px;
61
+ display: flex;
62
+ align-items: center;
63
+ justify-content: center;
64
+ color: white;
65
+ font-size: 1.5rem;
66
+ box-shadow: 0 4px 12px rgba(102, 126, 234, 0.3);
67
+ transition: all 0.3s ease;
68
+ }
69
+
70
+ .brand-icon:hover {
71
+ transform: rotate(5deg) scale(1.05);
72
+ box-shadow: 0 6px 16px rgba(102, 126, 234, 0.4);
73
+ }
74
+
75
+ .brand-text {
76
+ display: flex;
77
+ flex-direction: column;
78
+ gap: 2px;
79
+ }
80
+
81
+ .brand-name {
82
+ font-size: 1.25rem;
83
+ font-weight: 700;
84
+ color: #1e293b;
85
+ letter-spacing: -0.025em;
86
+ }
87
+
88
+ .brand-subtitle {
89
+ font-size: 0.75rem;
90
+ color: #64748b;
91
+ font-weight: 500;
92
+ letter-spacing: 0.05em;
93
+ text-transform: uppercase;
94
+ }
95
+
96
+ /* 移动端切换按钮 */
97
+ .navbar-toggler-modern {
98
+ background: none;
99
+ border: none;
100
+ padding: 0.5rem;
101
+ cursor: pointer;
102
+ display: none;
103
+ flex-direction: column;
104
+ gap: 4px;
105
+ }
106
+
107
+ .navbar-toggler-line {
108
+ width: 25px;
109
+ height: 3px;
110
+ background: linear-gradient(90deg, #667eea, #764ba2);
111
+ border-radius: 2px;
112
+ transition: all 0.3s ease;
113
+ }
114
+
115
+ /* 导航折叠区域 */
116
+ .navbar-collapse-modern {
117
+ background: transparent;
118
+ }
119
+
120
+ /* 主导航样式 */
121
+ .navbar-nav-modern {
122
+ display: flex;
123
+ align-items: center;
124
+ gap: 0.5rem;
125
+ }
126
+
127
+ .nav-item-modern {
128
+ position: relative;
129
+ }
130
+
131
+ .nav-link-modern {
132
+ display: flex;
133
+ align-items: center;
134
+ gap: 0.75rem;
135
+ padding: 0.75rem 1.25rem;
136
+ border-radius: 12px;
137
+ color: #64748b;
138
+ text-decoration: none;
139
+ font-weight: 500;
140
+ transition: all 0.3s ease;
141
+ position: relative;
142
+ overflow: hidden;
143
+ }
144
+
145
+ .nav-link-modern:hover {
146
+ background: rgba(102, 126, 234, 0.1);
147
+ color: #667eea;
148
+ transform: translateY(-1px);
149
+ }
150
+
151
+ .nav-link-modern.active {
152
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
153
+ color: white;
154
+ box-shadow: 0 4px 12px rgba(102, 126, 234, 0.3);
155
+ }
156
+
157
+ .nav-icon {
158
+ font-size: 1.25rem;
159
+ display: flex;
160
+ align-items: center;
161
+ justify-content: center;
162
+ min-width: 24px;
163
+ }
164
+
165
+ .nav-text {
166
+ font-size: 0.95rem;
167
+ font-weight: 600;
168
+ letter-spacing: 0.025em;
169
+ }
170
+
171
+ .nav-indicator {
172
+ position: absolute;
173
+ bottom: 0;
174
+ left: 50%;
175
+ transform: translateX(-50%);
176
+ width: 4px;
177
+ height: 4px;
178
+ background: white;
179
+ border-radius: 50%;
180
+ opacity: 0;
181
+ transition: all 0.3s ease;
182
+ }
183
+
184
+ .nav-link-modern.active .nav-indicator {
185
+ opacity: 1;
186
+ }
187
+
188
+ /* 用户菜单样式 */
189
+ .nav-icon-only {
190
+ padding: 0.75rem;
191
+ min-width: auto;
192
+ }
193
+
194
+ .notification-dot {
195
+ position: absolute;
196
+ top: 8px;
197
+ right: 8px;
198
+ width: 8px;
199
+ height: 8px;
200
+ background: #ef4444;
201
+ border-radius: 50%;
202
+ border: 2px solid white;
203
+ animation: pulse 2s ease-in-out infinite;
204
+ }
205
+
206
+ .user-menu-toggle {
207
+ display: flex;
208
+ align-items: center;
209
+ gap: 0.75rem;
210
+ padding: 0.5rem;
211
+ border-radius: 12px;
212
+ transition: all 0.3s ease;
213
+ }
214
+
215
+ .user-menu-toggle:hover {
216
+ background: rgba(102, 126, 234, 0.1);
217
+ }
218
+
219
+ .user-avatar {
220
+ width: 40px;
221
+ height: 40px;
222
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
223
+ border-radius: 50%;
224
+ display: flex;
225
+ align-items: center;
226
+ justify-content: center;
227
+ color: white;
228
+ font-size: 1.25rem;
229
+ box-shadow: 0 2px 8px rgba(102, 126, 234, 0.3);
230
+ }
231
+
232
+ .user-info {
233
+ display: flex;
234
+ flex-direction: column;
235
+ gap: 2px;
236
+ }
237
+
238
+ .user-name {
239
+ font-size: 0.9rem;
240
+ font-weight: 600;
241
+ color: #1e293b;
242
+ }
243
+
244
+ .user-role {
245
+ font-size: 0.75rem;
246
+ color: #64748b;
247
+ font-weight: 500;
248
+ }
249
+
250
+ .dropdown-arrow {
251
+ color: #94a3b8;
252
+ font-size: 0.75rem;
253
+ transition: all 0.3s ease;
254
+ }
255
+
256
+ .user-menu-toggle:hover .dropdown-arrow {
257
+ color: #667eea;
258
+ transform: translateY(1px);
259
+ }
260
+
261
+ /* 现代下拉菜单样式 */
262
+ .dropdown-menu-modern {
263
+ background: white;
264
+ border: 1px solid #e2e8f0;
265
+ border-radius: 16px;
266
+ box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1), 0 4px 10px rgba(0, 0, 0, 0.05);
267
+ padding: 0.75rem;
268
+ min-width: 280px;
269
+ backdrop-filter: blur(10px);
270
+ margin-top: 0.75rem;
271
+ }
272
+
273
+ .dropdown-header {
274
+ padding: 0.5rem 0.75rem;
275
+ font-size: 0.75rem;
276
+ font-weight: 700;
277
+ color: #94a3b8;
278
+ text-transform: uppercase;
279
+ letter-spacing: 0.05em;
280
+ border-bottom: 1px solid #f1f5f9;
281
+ margin-bottom: 0.5rem;
282
+ }
283
+
284
+ .dropdown-item-modern {
285
+ display: flex;
286
+ align-items: center;
287
+ gap: 0.75rem;
288
+ padding: 0.75rem;
289
+ border-radius: 8px;
290
+ color: #374151;
291
+ text-decoration: none;
292
+ transition: all 0.2s ease;
293
+ margin-bottom: 2px;
294
+ }
295
+
296
+ .dropdown-item-modern:hover {
297
+ background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);
298
+ color: #667eea;
299
+ transform: translateX(4px);
300
+ }
301
+
302
+ .dropdown-item-modern.text-danger:hover {
303
+ background: linear-gradient(135deg, #fef2f2 0%, #fee2e2 100%);
304
+ color: #dc2626;
305
+ }
306
+
307
+ .dropdown-item-content {
308
+ display: flex;
309
+ flex-direction: column;
310
+ gap: 2px;
311
+ }
312
+
313
+ .dropdown-item-title {
314
+ font-size: 0.9rem;
315
+ font-weight: 600;
316
+ color: inherit;
317
+ }
318
+
319
+ .dropdown-item-desc {
320
+ font-size: 0.75rem;
321
+ color: #94a3b8;
322
+ }
323
+
324
+ .dropdown-divider-modern {
325
+ margin: 0.75rem -0.75rem;
326
+ border: none;
327
+ border-top: 1px solid #f1f5f9;
328
+ }
329
+
330
+ /* 主要内容区域 */
331
+ .main-content-modern {
332
+ flex: 1;
333
+ display: flex;
334
+ flex-direction: column;
335
+ background: transparent;
336
+ overflow: hidden;
337
+ }
338
+
339
+ .content-wrapper {
340
+ flex: 1;
341
+ background: rgba(255, 255, 255, 0.3);
342
+ backdrop-filter: blur(8px);
343
+ overflow-y: auto;
344
+ height: 100%;
345
+ }
346
+
347
+
348
+
349
+ /* 动画效果 */
350
+ @keyframes pulse {
351
+ 0%, 100% { opacity: 1; transform: scale(1); }
352
+ 50% { opacity: 0.6; transform: scale(1.2); }
353
+ }
354
+
355
+ /* 响应式设计 */
356
+ @media (max-width: 768px) {
357
+ .content-wrapper {
358
+ padding: 0.5rem;
359
+ }
360
+ }
361
+
362
+ @media (max-width: 480px) {
363
+ .content-wrapper {
364
+ padding: 0.25rem;
365
+ }
366
+ }
367
367
  </style>