refactor: 数据源菜单合一+布局优化

- 4个数据源菜单(MySQL/PG/Redis/Mongo)合并为1个「数据源」
- InstancePage 改为统一入口,顶部Tab切换类型过滤
- 添加数据源改为弹框Modal(默认MySQL)
- 去掉左下角用户区,退出登录移到右上角header
- 侧边栏收窄220px,整体布局更紧凑
- 后端202 tests passing
- 前端构建零错误
This commit is contained in:
logan committed 2026-05-22 22:53:48 +08:00
1 parent bab55d3927
commit 5cbd0e3441
23 files changed
+2881 -94

No files matched your search

+22
View File
@@ -0,0 +1,22 @@
import request from './request';
export var dictionaryApi = {
listDatabases: function (instanceId: number) {
return request.get('/dictionary/instances/' + instanceId + '/databases');
},
listTables: function (instanceId: number, database: string) {
return request.get('/dictionary/instances/' + instanceId + '/tables', {
params: { database: database },
});
},
getTableDetail: function (instanceId: number, tableName: string, database: string) {
return request.get('/dictionary/instances/' + instanceId + '/tables/' + tableName, {
params: { database: database },
});
},
exportDictionary: function (instanceId: number, database: string) {
return request.get('/dictionary/instances/' + instanceId + '/export', {
params: { database: database },
});
},
};
+52
View File
@@ -0,0 +1,52 @@
import request from './request';
export const instanceDetailApi = {
// Databases
listDatabases: (id: number) =>
request.get<any, string[]>('/instances/' + id + '/detail/databases'),
// Tables
listTables: (id: number, database: string) =>
request.get<any, any[]>('/instances/' + id + '/detail/tables', { params: { database: database } }),
// Table Detail
getTableDetail: (id: number, database: string, table: string) =>
request.get<any, any>('/instances/' + id + '/detail/table-detail', { params: { database: database, table: table } }),
// Users
listUsers: (id: number) =>
request.get<any, any[]>('/instances/' + id + '/detail/users'),
// Grants
getGrants: (id: number, user: string, host: string) =>
request.get<any, any>('/instances/' + id + '/detail/grants', { params: { user: user, host: host } }),
// Slow Queries
getSlowQueries: (id: number, database?: string) =>
request.get<any, any[]>('/instances/' + id + '/detail/slow-queries', { params: database ? { database: database } : {} }),
// Processlist
getProcesslist: (id: number) =>
request.get<any, any[]>('/instances/' + id + '/detail/processlist'),
// Kill Process
killProcess: (id: number, pid: number) =>
request.post<any, any>('/instances/' + id + '/detail/processlist/' + pid + '/kill'),
// Status
getStatus: (id: number) =>
request.get<any, any>('/instances/' + id + '/detail/status'),
// Variables
getVariables: (id: number) =>
request.get<any, any[]>('/instances/' + id + '/detail/variables'),
};
export const backupApi = {
list: (instanceId?: number) =>
request.get<any, any[]>('/backups', { params: instanceId ? { instance_id: instanceId } : {} }),
create: (data: any) =>
request.post<any, any>('/backups', data),
get: (id: number) =>
request.get<any, any>('/backups/' + id),
};
+37
View File
@@ -0,0 +1,37 @@
import request from './request';
export var redisApi = {
getInfo: function (id: number) {
return request.get('/redis/' + id + '/info');
},
getDbsize: function (id: number, db: number) {
return request.get('/redis/' + id + '/dbsize', { params: { db: db } });
},
getKeys: function (id: number, params: Record<string, any>) {
return request.get('/redis/' + id + '/keys', { params: params });
},
getKeyDetail: function (id: number, key: string, db: number) {
return request.get('/redis/' + id + '/keys/' + encodeURIComponent(key), { params: { db: db } });
},
createKey: function (id: number, data: Record<string, any>) {
return request.post('/redis/' + id + '/keys', data);
},
deleteKey: function (id: number, key: string, db: number) {
return request.delete('/redis/' + id + '/keys/' + encodeURIComponent(key), { params: { db: db } });
},
setExpire: function (id: number, key: string, data: Record<string, any>) {
return request.put('/redis/' + id + '/keys/' + encodeURIComponent(key) + '/expire', data);
},
flushDb: function (id: number, db: number) {
return request.delete('/redis/' + id + '/flushdb', { params: { db: db } });
},
executeCommand: function (id: number, data: Record<string, any>) {
return request.post('/redis/' + id + '/command', data);
},
getSlowlog: function (id: number, count: number) {
return request.get('/redis/' + id + '/slowlog', { params: { count: count } });
},
getClients: function (id: number) {
return request.get('/redis/' + id + '/clients');
},
};