fdb2 1.0.0
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.
- package/.dockerignore +21 -0
- package/.editorconfig +11 -0
- package/.eslintrc.cjs +14 -0
- package/.eslintrc.json +7 -0
- package/.prettierrc.js +3 -0
- package/.tpl.env +22 -0
- package/README.md +260 -0
- package/bin/build.sh +28 -0
- package/bin/deploy.sh +8 -0
- package/bin/dev.sh +10 -0
- package/bin/docker/.env +4 -0
- package/bin/docker/dev-docker-compose.yml +43 -0
- package/bin/docker/dev.Dockerfile +24 -0
- package/bin/docker/prod-docker-compose.yml +17 -0
- package/bin/docker/prod.Dockerfile +29 -0
- package/bin/fdb2.js +142 -0
- package/data/connections.demo.json +32 -0
- package/env.d.ts +1 -0
- package/nw-build.js +120 -0
- package/nw-dev.js +65 -0
- package/package.json +114 -0
- package/public/favicon.ico +0 -0
- package/public/index.html +9 -0
- package/public/modules/header.tpl +14 -0
- package/public/modules/initial_state.tpl +55 -0
- package/server/index.ts +677 -0
- package/server/model/connection.entity.ts +66 -0
- package/server/model/database.entity.ts +246 -0
- package/server/service/connection.service.ts +334 -0
- package/server/service/database/base.service.ts +363 -0
- package/server/service/database/database.service.ts +510 -0
- package/server/service/database/index.ts +7 -0
- package/server/service/database/mssql.service.ts +723 -0
- package/server/service/database/mysql.service.ts +761 -0
- package/server/service/database/oracle.service.ts +839 -0
- package/server/service/database/postgres.service.ts +744 -0
- package/server/service/database/sqlite.service.ts +559 -0
- package/server/service/session.service.ts +158 -0
- package/server.js +128 -0
- package/src/adapter/ajax.ts +135 -0
- package/src/assets/base.css +1 -0
- package/src/assets/database.css +950 -0
- package/src/assets/images/collapse.png +0 -0
- package/src/assets/images/no-login.png +0 -0
- package/src/assets/images/svg/illustrations/illustration-1.svg +1 -0
- package/src/assets/images/svg/illustrations/illustration-2.svg +2 -0
- package/src/assets/images/svg/illustrations/illustration-3.svg +50 -0
- package/src/assets/images/svg/illustrations/illustration-4.svg +1 -0
- package/src/assets/images/svg/illustrations/illustration-5.svg +73 -0
- package/src/assets/images/svg/illustrations/illustration-6.svg +89 -0
- package/src/assets/images/svg/illustrations/illustration-7.svg +39 -0
- package/src/assets/images/svg/illustrations/illustration-8.svg +1 -0
- package/src/assets/images/svg/separators/curve-2.svg +3 -0
- package/src/assets/images/svg/separators/curve.svg +3 -0
- package/src/assets/images/svg/separators/line.svg +3 -0
- package/src/assets/images/theme/light/screen-1-1000x800.jpg +0 -0
- package/src/assets/images/theme/light/screen-2-1000x800.jpg +0 -0
- package/src/assets/login/bg.jpg +0 -0
- package/src/assets/login/bg.png +0 -0
- package/src/assets/login/left.jpg +0 -0
- package/src/assets/logo.svg +73 -0
- package/src/assets/logo.webp +0 -0
- package/src/assets/main.css +1 -0
- package/src/base/config.ts +20 -0
- package/src/base/detect.ts +134 -0
- package/src/base/entity.ts +92 -0
- package/src/base/eventBus.ts +37 -0
- package/src/base//345/237/272/347/241/200/345/261/202.md +7 -0
- package/src/components/connection-editor/index.vue +590 -0
- package/src/components/dataGrid/index.vue +105 -0
- package/src/components/dataGrid/pagination.vue +106 -0
- package/src/components/loading/index.vue +43 -0
- package/src/components/modal/index.ts +181 -0
- package/src/components/modal/index.vue +560 -0
- package/src/components/toast/index.ts +44 -0
- package/src/components/toast/toast.vue +58 -0
- package/src/components/user/name.vue +104 -0
- package/src/components/user/selector.vue +416 -0
- package/src/domain/SysConfig.ts +74 -0
- package/src/platform/App.vue +8 -0
- package/src/platform/database/components/connection-detail.vue +1154 -0
- package/src/platform/database/components/data-editor.vue +478 -0
- package/src/platform/database/components/data-import-export.vue +1602 -0
- package/src/platform/database/components/database-detail.vue +1173 -0
- package/src/platform/database/components/database-monitor.vue +1086 -0
- package/src/platform/database/components/db-tools.vue +577 -0
- package/src/platform/database/components/query-history.vue +1349 -0
- package/src/platform/database/components/sql-executor.vue +738 -0
- package/src/platform/database/components/sql-query-editor.vue +1046 -0
- package/src/platform/database/components/table-detail.vue +1376 -0
- package/src/platform/database/components/table-editor.vue +690 -0
- package/src/platform/database/explorer.vue +1840 -0
- package/src/platform/database/index.vue +1193 -0
- package/src/platform/database/layout.vue +367 -0
- package/src/platform/database/router.ts +37 -0
- package/src/platform/database/styles/common.scss +602 -0
- package/src/platform/database/types/common.ts +445 -0
- package/src/platform/database/utils/export.ts +232 -0
- package/src/platform/database/utils/helpers.ts +437 -0
- package/src/platform/index.ts +33 -0
- package/src/platform/router.ts +41 -0
- package/src/service/base.ts +128 -0
- package/src/service/database.ts +500 -0
- package/src/service/login.ts +121 -0
- package/src/shims-vue.d.ts +7 -0
- package/src/stores/connection.ts +266 -0
- package/src/stores/session.ts +87 -0
- package/src/typings/database-types.ts +413 -0
- package/src/typings/database.ts +364 -0
- package/src/typings/global.d.ts +58 -0
- package/src/typings/pinia.d.ts +8 -0
- package/src/utils/clipboard.ts +30 -0
- package/src/utils/database-types.ts +243 -0
- package/src/utils/modal.ts +124 -0
- package/src/utils/request.ts +55 -0
- package/src/utils/sleep.ts +4 -0
- package/src/utils/toast.ts +73 -0
- package/src/utils/util.ts +171 -0
- package/src/utils/xlsx.ts +228 -0
- package/tsconfig.json +33 -0
- package/tsconfig.server.json +19 -0
- package/view/index.html +9 -0
- package/view/modules/header.tpl +14 -0
- package/view/modules/initial_state.tpl +20 -0
- package/vite.config.ts +384 -0
|
@@ -0,0 +1,500 @@
|
|
|
1
|
+
import { request } from '@/service/base';
|
|
2
|
+
import type { ConnectionEntity, DatabaseEntity, TableEntity, ColumnEntity, IndexEntity, ForeignKeyEntity } from '@/typings/database';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* 数据库连接管理服务
|
|
6
|
+
*/
|
|
7
|
+
export class ConnectionService {
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* 获取所有数据库连接配置
|
|
11
|
+
*/
|
|
12
|
+
async getAllConnections() {
|
|
13
|
+
return request('/api/database/getConnections', {});
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* 根据ID获取数据库连接配置
|
|
18
|
+
*/
|
|
19
|
+
async getConnectionById(id: string) {
|
|
20
|
+
return request('/api/database/getConnection', { id });
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* 添加数据库连接配置
|
|
25
|
+
*/
|
|
26
|
+
async addConnection(connection: ConnectionEntity) {
|
|
27
|
+
return request('/api/database/addConnection', connection);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* 更新数据库连接配置
|
|
32
|
+
*/
|
|
33
|
+
async updateConnection(id: string, updates: Partial<ConnectionEntity>) {
|
|
34
|
+
return request('/api/database/updateConnection', { id, ...updates });
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* 删除数据库连接配置
|
|
39
|
+
*/
|
|
40
|
+
async deleteConnection(id: string) {
|
|
41
|
+
return request('/api/database/deleteConnection', { id });
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* 测试数据库连接
|
|
46
|
+
*/
|
|
47
|
+
async testConnection(connection: ConnectionEntity) {
|
|
48
|
+
return request('/api/database/testConnection', connection);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* 获取支持的数据库类型
|
|
53
|
+
*/
|
|
54
|
+
async getDatabaseTypes() {
|
|
55
|
+
return request('/api/database/getSupportedDatabaseTypes');
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* 创建数据库
|
|
60
|
+
*/
|
|
61
|
+
async createDatabase(connectionId: string, databaseName: string, options?: any) {
|
|
62
|
+
return request('/api/database/createDatabase', {
|
|
63
|
+
id: connectionId,
|
|
64
|
+
databaseName,
|
|
65
|
+
options
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* 删除数据库
|
|
71
|
+
*/
|
|
72
|
+
async dropDatabase(connectionId: string, databaseName: string) {
|
|
73
|
+
return request('/api/database/dropDatabase', {
|
|
74
|
+
id: connectionId,
|
|
75
|
+
databaseName
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* 数据库管理服务
|
|
82
|
+
*/
|
|
83
|
+
export class DatabaseService {
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* 获取数据库列表
|
|
87
|
+
*/
|
|
88
|
+
async getDatabases(connectionId: string) {
|
|
89
|
+
return request('/api/database/getDatabases', { id: connectionId });
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* 获取数据库详细信息
|
|
94
|
+
*/
|
|
95
|
+
async getDatabaseInfo(connectionId: string, databaseName: string) {
|
|
96
|
+
return request('/api/database/getDatabaseInfo', { id: connectionId, database: databaseName });
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* 获取数据库表列表
|
|
101
|
+
*/
|
|
102
|
+
async getTables(connectionId: string, databaseName: string) {
|
|
103
|
+
return request('/api/database/getTables', { id: connectionId, database: databaseName });
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* 获取表详细信息
|
|
108
|
+
*/
|
|
109
|
+
async getTableInfo(connectionId: string, databaseName: string, tableName: string) {
|
|
110
|
+
return request('/api/database/getTableInfo', { id: connectionId, database: databaseName, table: tableName });
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* 获取表数据
|
|
115
|
+
*/
|
|
116
|
+
async getTableData(
|
|
117
|
+
connectionId: string,
|
|
118
|
+
databaseName: string,
|
|
119
|
+
tableName: string,
|
|
120
|
+
page: number = 1,
|
|
121
|
+
pageSize: number = 100,
|
|
122
|
+
where?: string,
|
|
123
|
+
orderBy?: string
|
|
124
|
+
) {
|
|
125
|
+
const params = {
|
|
126
|
+
id: connectionId,
|
|
127
|
+
database: databaseName,
|
|
128
|
+
table: tableName,
|
|
129
|
+
page,
|
|
130
|
+
pageSize,
|
|
131
|
+
where,
|
|
132
|
+
orderBy
|
|
133
|
+
};
|
|
134
|
+
return request('/api/database/getTableData', params);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* 执行SQL查询
|
|
139
|
+
*/
|
|
140
|
+
async executeQuery(connectionId: string, sql: string, databaseName?: string) {
|
|
141
|
+
return request('/api/database/executeQuery', { id: connectionId, sql, database: databaseName });
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* 关闭数据库连接
|
|
146
|
+
*/
|
|
147
|
+
async closeConnection(connectionId: string) {
|
|
148
|
+
return request('/api/database/closeConnection', { id: connectionId });
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* 导出表数据
|
|
153
|
+
*/
|
|
154
|
+
async exportTableData(
|
|
155
|
+
connectionId: string,
|
|
156
|
+
databaseName: string,
|
|
157
|
+
tableName: string,
|
|
158
|
+
format: string = 'json',
|
|
159
|
+
where?: string
|
|
160
|
+
) {
|
|
161
|
+
return request('/api/database/exportTableData', {
|
|
162
|
+
id: connectionId,
|
|
163
|
+
database: databaseName,
|
|
164
|
+
table: tableName,
|
|
165
|
+
format,
|
|
166
|
+
where
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* 导出表数据到SQL文件
|
|
172
|
+
*/
|
|
173
|
+
async exportTableDataToSQL(
|
|
174
|
+
connectionId: string,
|
|
175
|
+
databaseName: string,
|
|
176
|
+
tableName: string,
|
|
177
|
+
options?: any
|
|
178
|
+
) {
|
|
179
|
+
return request('/api/database/exportTableDataToSQL', {
|
|
180
|
+
id: connectionId,
|
|
181
|
+
database: databaseName,
|
|
182
|
+
table: tableName,
|
|
183
|
+
options
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* 导出表数据到CSV文件
|
|
189
|
+
*/
|
|
190
|
+
async exportTableDataToCSV(
|
|
191
|
+
connectionId: string,
|
|
192
|
+
databaseName: string,
|
|
193
|
+
tableName: string,
|
|
194
|
+
options?: any
|
|
195
|
+
) {
|
|
196
|
+
return request('/api/database/exportTableDataToCSV', {
|
|
197
|
+
id: connectionId,
|
|
198
|
+
database: databaseName,
|
|
199
|
+
table: tableName,
|
|
200
|
+
options
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* 导出表数据到JSON文件
|
|
206
|
+
*/
|
|
207
|
+
async exportTableDataToJSON(
|
|
208
|
+
connectionId: string,
|
|
209
|
+
databaseName: string,
|
|
210
|
+
tableName: string,
|
|
211
|
+
options?: any
|
|
212
|
+
) {
|
|
213
|
+
return request('/api/database/exportTableDataToJSON', {
|
|
214
|
+
id: connectionId,
|
|
215
|
+
database: databaseName,
|
|
216
|
+
table: tableName,
|
|
217
|
+
options
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* 导出表数据到Excel文件
|
|
223
|
+
*/
|
|
224
|
+
async exportTableDataToExcel(
|
|
225
|
+
connectionId: string,
|
|
226
|
+
databaseName: string,
|
|
227
|
+
tableName: string,
|
|
228
|
+
options?: any
|
|
229
|
+
) {
|
|
230
|
+
return request('/api/database/exportTableDataToExcel', {
|
|
231
|
+
id: connectionId,
|
|
232
|
+
database: databaseName,
|
|
233
|
+
table: tableName,
|
|
234
|
+
options
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* 保存表结构(新建表)
|
|
240
|
+
*/
|
|
241
|
+
async saveTableStructure(
|
|
242
|
+
connectionId: string,
|
|
243
|
+
database: string,
|
|
244
|
+
table: any,
|
|
245
|
+
columns: any[]
|
|
246
|
+
) {
|
|
247
|
+
return request('/api/database/saveTableStructure', {
|
|
248
|
+
id: connectionId,
|
|
249
|
+
database,
|
|
250
|
+
table,
|
|
251
|
+
columns
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* 修改表结构
|
|
257
|
+
*/
|
|
258
|
+
async alterTable(
|
|
259
|
+
connectionId: string,
|
|
260
|
+
database: string,
|
|
261
|
+
tableName: string,
|
|
262
|
+
columns: any[],
|
|
263
|
+
oldColumns?: any[]
|
|
264
|
+
) {
|
|
265
|
+
return request('/api/database/alterTable', {
|
|
266
|
+
id: connectionId,
|
|
267
|
+
database,
|
|
268
|
+
tableName,
|
|
269
|
+
columns,
|
|
270
|
+
oldColumns
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* 插入数据
|
|
276
|
+
*/
|
|
277
|
+
async insertData(
|
|
278
|
+
connectionId: string,
|
|
279
|
+
database: string,
|
|
280
|
+
tableName: string,
|
|
281
|
+
data: any
|
|
282
|
+
) {
|
|
283
|
+
return request('/api/database/insertData', {
|
|
284
|
+
id: connectionId,
|
|
285
|
+
database,
|
|
286
|
+
table: tableName,
|
|
287
|
+
data
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* 更新数据
|
|
293
|
+
*/
|
|
294
|
+
async updateData(
|
|
295
|
+
connectionId: string,
|
|
296
|
+
database: string,
|
|
297
|
+
tableName: string,
|
|
298
|
+
data: any,
|
|
299
|
+
where: any
|
|
300
|
+
) {
|
|
301
|
+
return request('/api/database/updateData', {
|
|
302
|
+
id: connectionId,
|
|
303
|
+
database,
|
|
304
|
+
table: tableName,
|
|
305
|
+
data,
|
|
306
|
+
where
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
/**
|
|
311
|
+
* 删除数据
|
|
312
|
+
*/
|
|
313
|
+
async deleteData(
|
|
314
|
+
connectionId: string,
|
|
315
|
+
database: string,
|
|
316
|
+
tableName: string,
|
|
317
|
+
where: any
|
|
318
|
+
) {
|
|
319
|
+
return request('/api/database/deleteData', {
|
|
320
|
+
id: connectionId,
|
|
321
|
+
database,
|
|
322
|
+
table: tableName,
|
|
323
|
+
where
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
/**
|
|
328
|
+
* 截断表
|
|
329
|
+
*/
|
|
330
|
+
async truncateTable(
|
|
331
|
+
connectionId: string,
|
|
332
|
+
database: string,
|
|
333
|
+
tableName: string
|
|
334
|
+
) {
|
|
335
|
+
return request(`/api/database/truncateTable/${connectionId}/${database}/${tableName}`);
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
/**
|
|
339
|
+
* 删除表
|
|
340
|
+
*/
|
|
341
|
+
async dropTable(
|
|
342
|
+
connectionId: string,
|
|
343
|
+
database: string,
|
|
344
|
+
tableName: string
|
|
345
|
+
) {
|
|
346
|
+
return request(`/api/database/dropTable/${connectionId}/${database}/${tableName}`);
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
/**
|
|
350
|
+
* 数据库备份
|
|
351
|
+
*/
|
|
352
|
+
async backupDatabase(
|
|
353
|
+
connectionId: string,
|
|
354
|
+
database: string,
|
|
355
|
+
options?: any
|
|
356
|
+
) {
|
|
357
|
+
return request('/api/database/backup', { id: connectionId, databaseName: database, options });
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
/**
|
|
361
|
+
* 恢复数据库
|
|
362
|
+
*/
|
|
363
|
+
async restoreDatabase(
|
|
364
|
+
connectionId: string,
|
|
365
|
+
database: string,
|
|
366
|
+
filePath: string,
|
|
367
|
+
options?: any
|
|
368
|
+
) {
|
|
369
|
+
return request('/api/database/restore', { id: connectionId, databaseName: database, filePath, options });
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
/**
|
|
373
|
+
* 获取数据库统计信息
|
|
374
|
+
*/
|
|
375
|
+
async getDatabaseStats(
|
|
376
|
+
connectionId: string,
|
|
377
|
+
database: string
|
|
378
|
+
) {
|
|
379
|
+
return request('/api/database/getStats', { id: connectionId, databaseName: database });
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
/**
|
|
383
|
+
* 优化数据库
|
|
384
|
+
*/
|
|
385
|
+
async optimizeDatabase(
|
|
386
|
+
connectionId: string,
|
|
387
|
+
database: string
|
|
388
|
+
) {
|
|
389
|
+
return request('/api/database/optimize', { id: connectionId, databaseName: database });
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
/**
|
|
393
|
+
* 分析表
|
|
394
|
+
*/
|
|
395
|
+
async analyzeTables(
|
|
396
|
+
connectionId: string,
|
|
397
|
+
database: string
|
|
398
|
+
) {
|
|
399
|
+
return request('/api/database/analyze', { id: connectionId, databaseName: database });
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
/**
|
|
403
|
+
* 修复表
|
|
404
|
+
*/
|
|
405
|
+
async repairTables(
|
|
406
|
+
connectionId: string,
|
|
407
|
+
database: string
|
|
408
|
+
) {
|
|
409
|
+
return request('/api/database/repair', { id: connectionId, databaseName: database });
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
/**
|
|
413
|
+
* 检查数据库健康状态
|
|
414
|
+
*/
|
|
415
|
+
async checkDatabaseHealth(
|
|
416
|
+
connectionId: string,
|
|
417
|
+
database: string
|
|
418
|
+
) {
|
|
419
|
+
return request(`/api/database/health/${connectionId}/${database}`);
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
/**
|
|
423
|
+
* 获取视图列表
|
|
424
|
+
*/
|
|
425
|
+
async getViews(connectionId: string, databaseName: string) {
|
|
426
|
+
return request('/api/database/getViews', { id: connectionId, database: databaseName });
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
/**
|
|
430
|
+
* 获取视图定义
|
|
431
|
+
*/
|
|
432
|
+
async getViewDefinition(connectionId: string, databaseName: string, viewName: string) {
|
|
433
|
+
return request('/api/database/getViewDefinition', { id: connectionId, database: databaseName, viewName });
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
/**
|
|
437
|
+
* 创建视图
|
|
438
|
+
*/
|
|
439
|
+
async createView(connectionId: string, databaseName: string, viewName: string, definition: string) {
|
|
440
|
+
return request('/api/database/createView', {
|
|
441
|
+
id: connectionId,
|
|
442
|
+
database: databaseName,
|
|
443
|
+
viewName,
|
|
444
|
+
definition
|
|
445
|
+
});
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
/**
|
|
449
|
+
* 删除视图
|
|
450
|
+
*/
|
|
451
|
+
async dropView(connectionId: string, databaseName: string, viewName: string) {
|
|
452
|
+
return request('/api/database/dropView', {
|
|
453
|
+
id: connectionId,
|
|
454
|
+
database: databaseName,
|
|
455
|
+
viewName
|
|
456
|
+
});
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
/**
|
|
460
|
+
* 获取存储过程列表
|
|
461
|
+
*/
|
|
462
|
+
async getProcedures(connectionId: string, databaseName: string) {
|
|
463
|
+
return request('/api/database/getProcedures', { id: connectionId, database: databaseName });
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
/**
|
|
467
|
+
* 获取存储过程定义
|
|
468
|
+
*/
|
|
469
|
+
async getProcedureDefinition(connectionId: string, databaseName: string, procedureName: string) {
|
|
470
|
+
return request('/api/database/getProcedureDefinition', {
|
|
471
|
+
id: connectionId,
|
|
472
|
+
database: databaseName,
|
|
473
|
+
procedureName
|
|
474
|
+
});
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
/**
|
|
478
|
+
* 创建存储过程
|
|
479
|
+
*/
|
|
480
|
+
async createProcedure(connectionId: string, databaseName: string, procedureName: string, definition: string) {
|
|
481
|
+
const sql = `CREATE PROCEDURE \`${procedureName}\` ${definition}`;
|
|
482
|
+
return request('/api/database/executeQuery', {
|
|
483
|
+
id: connectionId,
|
|
484
|
+
sql,
|
|
485
|
+
database: databaseName
|
|
486
|
+
});
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
/**
|
|
490
|
+
* 删除存储过程
|
|
491
|
+
*/
|
|
492
|
+
async dropProcedure(connectionId: string, databaseName: string, procedureName: string) {
|
|
493
|
+
const sql = `DROP PROCEDURE \`${procedureName}\``;
|
|
494
|
+
return request('/api/database/executeQuery', {
|
|
495
|
+
id: connectionId,
|
|
496
|
+
sql,
|
|
497
|
+
database: databaseName
|
|
498
|
+
});
|
|
499
|
+
}
|
|
500
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { sysConfig } from '@/domain/SysConfig';
|
|
2
|
+
import { request } from './base';
|
|
3
|
+
import { type RouteLocationNormalizedGeneric } from 'vue-router';
|
|
4
|
+
import Cookies from 'js-cookie';
|
|
5
|
+
import { useSessionStore } from '@/stores/session';
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
// 登陆
|
|
10
|
+
export async function login(account: string, password: string) {
|
|
11
|
+
try {
|
|
12
|
+
const res = await request('/api/session/loginByAccount', {
|
|
13
|
+
account,
|
|
14
|
+
password,
|
|
15
|
+
});
|
|
16
|
+
const sessionStorre = useSessionStore();
|
|
17
|
+
sessionStorre.setSession(res);
|
|
18
|
+
return { ret: 0, msg: '登录成功', data: res };
|
|
19
|
+
} catch (error) {
|
|
20
|
+
return { ret: error.ret || -1, msg: error.msg || '登录失败' };
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
export async function getLoginSession(token: string) {
|
|
26
|
+
try {
|
|
27
|
+
const res = await request('/api/session/getLoginSession', {
|
|
28
|
+
token
|
|
29
|
+
});
|
|
30
|
+
return { ret: 0, msg: '获取成功', data: res };
|
|
31
|
+
} catch (error) {
|
|
32
|
+
return { ret: error.ret || -1, msg: error.msg || '获取登录会话失败' };
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
export async function loginByCode(authCode: string,) {
|
|
38
|
+
try {
|
|
39
|
+
const res = await request('/api/session/loginByCode', {
|
|
40
|
+
authCode,
|
|
41
|
+
});
|
|
42
|
+
return { ret: 0, msg: '登录成功', data: res };
|
|
43
|
+
} catch (error) {
|
|
44
|
+
return { ret: error.ret || -1, msg: error.msg || '登录失败' };
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export async function logout() {
|
|
49
|
+
try {
|
|
50
|
+
const sessionStorre = useSessionStore();
|
|
51
|
+
sessionStorre.clearSession();
|
|
52
|
+
Cookies.remove('token');
|
|
53
|
+
const res = await request('/api/session/logout');
|
|
54
|
+
return { ret: 0, msg: '登出成功', data: res };
|
|
55
|
+
} catch (error) {
|
|
56
|
+
return { ret: error.ret || -1, msg: error.msg || '登出失败' };
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export function getLoginUrl(redirectUrl = location.href) {
|
|
61
|
+
return sysConfig.getLoginUrl(redirectUrl);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export function getLogoutUrl(redirectUrl = location.href) {
|
|
65
|
+
return sysConfig.getLogoutUrl(redirectUrl);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export async function redirectToLogin() {
|
|
69
|
+
const url = getLoginUrl();
|
|
70
|
+
location.replace(url);
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// 如果没有登陆则跳去
|
|
75
|
+
export async function checkLogin() {
|
|
76
|
+
const sessionStore = useSessionStore();
|
|
77
|
+
console.log('Current state:', sessionStore.$state);
|
|
78
|
+
if(!sessionStore.isLoggedIn) return await redirectToLogin();
|
|
79
|
+
return sessionStore;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// 如果没有session,但有cookie或auth_code登陆码,则去验证
|
|
83
|
+
export async function initLoginState(to?: RouteLocationNormalizedGeneric) {
|
|
84
|
+
const sessionStore = useSessionStore();
|
|
85
|
+
if(sessionStore.isLoggedIn) return true;
|
|
86
|
+
|
|
87
|
+
try {
|
|
88
|
+
const token = Cookies.get('token');
|
|
89
|
+
if(token) {
|
|
90
|
+
const res = await getLoginSession(token);
|
|
91
|
+
if(res.ret === 0 && res.data) {
|
|
92
|
+
sessionStore.setSession(res.data);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
if(sessionStore.isLoggedIn) return true;
|
|
97
|
+
|
|
98
|
+
// 获取当前 URL 的查询参数
|
|
99
|
+
const currentUrl = new URL(window.location.href);
|
|
100
|
+
const authCode = currentUrl.searchParams.get('auth_code');
|
|
101
|
+
// 删除 URL 中的 auth_code 参数
|
|
102
|
+
if (authCode) {
|
|
103
|
+
|
|
104
|
+
const res = await loginByCode(authCode);
|
|
105
|
+
|
|
106
|
+
if(res.ret === 0 && res.data) {
|
|
107
|
+
sessionStore.setSession(res.data);
|
|
108
|
+
Cookies.set('token', res.data.id);
|
|
109
|
+
}
|
|
110
|
+
currentUrl.searchParams.delete('auth_code');
|
|
111
|
+
const noauthUrl = currentUrl.toString();
|
|
112
|
+
console.log(noauthUrl);
|
|
113
|
+
window.location.replace(noauthUrl);
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
catch(e) {
|
|
118
|
+
console.error(e);
|
|
119
|
+
}
|
|
120
|
+
return true;
|
|
121
|
+
}
|