From fe8cd93c789ff675de8130782f597a06f75908d0 Mon Sep 17 00:00:00 2001 From: "meilin.huang" <954537473@qq.com> Date: Thu, 30 Jun 2022 16:42:25 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E5=AF=BC=E5=87=BA=E5=8A=9F=E8=83=BD&=E5=85=B6?= =?UTF-8?q?=E4=BB=96=E5=B0=8F=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../layout/navBars/breadcrumb/search.vue | 3 +- mayfly_go_web/src/views/ops/db/DbList.vue | 63 +++++++++++ mayfly_go_web/src/views/ops/db/SqlExec.vue | 2 +- mayfly_go_web/src/views/ops/db/api.ts | 1 + .../views/ops/db/component/SqlExecDialog.vue | 11 +- server/go.mod | 10 +- server/internal/devops/api/db.go | 106 ++++++++++++++++-- server/internal/devops/application/db_app.go | 12 +- server/internal/devops/router/db.go | 6 + server/pkg/ctx/req_ctx.go | 7 +- server/pkg/utils/str_utils.go | 44 ++++++++ 11 files changed, 234 insertions(+), 31 deletions(-) diff --git a/mayfly_go_web/src/views/layout/navBars/breadcrumb/search.vue b/mayfly_go_web/src/views/layout/navBars/breadcrumb/search.vue index 3ff23615..873ea177 100644 --- a/mayfly_go_web/src/views/layout/navBars/breadcrumb/search.vue +++ b/mayfly_go_web/src/views/layout/navBars/breadcrumb/search.vue @@ -30,7 +30,7 @@ import { useStore } from '@/store/index.ts'; export default defineComponent({ name: 'layoutBreadcrumbSearch', setup() { - const layoutMenuAutocompleteRef = ref(); + const layoutMenuAutocompleteRef: any = ref(null); const store = useStore(); const router = useRouter(); const state: any = reactive({ @@ -68,7 +68,6 @@ export default defineComponent({ // 初始化菜单数据 const initTageView = () => { if (state.tagsViewList.length > 0) return false; - console.log(getRoutes(store.state.routesList.routesList)); getRoutes(store.state.routesList.routesList).map((v: any) => { if (!v.meta.isHide) { state.tagsViewList.push({ ...v }); diff --git a/mayfly_go_web/src/views/ops/db/DbList.vue b/mayfly_go_web/src/views/ops/db/DbList.vue index 15aabc52..6cd8ced0 100644 --- a/mayfly_go_web/src/views/ops/db/DbList.vue +++ b/mayfly_go_web/src/views/ops/db/DbList.vue @@ -72,6 +72,32 @@ + + + + + 结构 + 数据 + 结构+数据 + + + + + + + + + + + +
+ 取消 + 确定 +
+
+ 创建表
@@ -226,6 +252,10 @@ import { dbApi } from './api'; import enums from './enums'; import { projectApi } from '../project/api.ts'; import SqlExecBox from './component/SqlExecBox.ts'; +import config from '@/common/config'; +import { getSession } from '@/common/utils/storage'; +import { isTrue } from '@/common/assert'; + export default defineComponent({ name: 'DbList', components: { @@ -255,6 +285,13 @@ export default defineComponent({ }, datas: [], total: 0, + showDumpInfo: false, + dumpInfo: { + id: 0, + db: '', + type: 3, + tables: [], + }, // sql执行记录弹框 sqlExecLogDialog: { title: '', @@ -392,6 +429,29 @@ export default defineComponent({ searchSqlExecLog(); }; + /** + * 选择导出数据库表 + */ + const handleDumpTableSelectionChange = (vals: any) => { + state.dumpInfo.tables = vals.map((x: any) => x.tableName); + }; + + /** + * 数据库信息导出 + */ + const dump = (db: string) => { + isTrue(state.dumpInfo.tables.length > 0, '请选择要导出的表'); + const a = document.createElement('a'); + a.setAttribute( + 'href', + `${config.baseApiUrl}/dbs/${state.dbId}/dump?db=${db}&type=${state.dumpInfo.type}&tables=${state.dumpInfo.tables.join( + ',' + )}&token=${getSession('token')}` + ); + a.click(); + state.showDumpInfo = false; + }; + const onShowRollbackSql = async (sqlExecLog: any) => { const columns = await dbApi.columnMetadata.request({ id: sqlExecLog.dbId, db: sqlExecLog.db, tableName: sqlExecLog.table }); const primaryKey = columns[0].columnName; @@ -447,6 +507,7 @@ export default defineComponent({ }; const closeTableInfo = () => { + state.showDumpInfo = false; state.tableInfoDialog.visible = false; state.tableInfoDialog.infos = []; }; @@ -516,6 +577,8 @@ export default defineComponent({ valChange, deleteDb, onShowSqlExec, + handleDumpTableSelectionChange, + dump, onBeforeCloseSqlExecDialog, handleSqlExecPageChange, searchSqlExecLog, diff --git a/mayfly_go_web/src/views/ops/db/SqlExec.vue b/mayfly_go_web/src/views/ops/db/SqlExec.vue index 9be5ff8f..bc98f4e9 100644 --- a/mayfly_go_web/src/views/ops/db/SqlExec.vue +++ b/mayfly_go_web/src/views/ops/db/SqlExec.vue @@ -927,7 +927,7 @@ export default defineComponent({ return; } // 转为字符串比较,可能存在数字等 - let text = row[property] + ''; + let text = (row[property] ? row[property] : '') + ''; let div = cell.children[0]; if (div) { let input = document.createElement('input'); diff --git a/mayfly_go_web/src/views/ops/db/api.ts b/mayfly_go_web/src/views/ops/db/api.ts index ffe31bc7..712ff3b3 100644 --- a/mayfly_go_web/src/views/ops/db/api.ts +++ b/mayfly_go_web/src/views/ops/db/api.ts @@ -5,6 +5,7 @@ export const dbApi = { dbs: Api.create("/dbs", 'get'), saveDb: Api.create("/dbs", 'post'), deleteDb: Api.create("/dbs/{id}", 'delete'), + dumpDb: Api.create("/dbs/{id}/dump", 'post'), tableInfos: Api.create("/dbs/{id}/t-infos", 'get'), tableIndex: Api.create("/dbs/{id}/t-index", 'get'), tableDdl: Api.create("/dbs/{id}/t-create-ddl", 'get'), diff --git a/mayfly_go_web/src/views/ops/db/component/SqlExecDialog.vue b/mayfly_go_web/src/views/ops/db/component/SqlExecDialog.vue index 7a56681a..1c8efa1e 100644 --- a/mayfly_go_web/src/views/ops/db/component/SqlExecDialog.vue +++ b/mayfly_go_web/src/views/ops/db/component/SqlExecDialog.vue @@ -2,7 +2,7 @@
- +