diff --git a/mayfly_go_web/src/views/ops/db/DbList.vue b/mayfly_go_web/src/views/ops/db/DbList.vue index 9871f270..7d50162f 100644 --- a/mayfly_go_web/src/views/ops/db/DbList.vue +++ b/mayfly_go_web/src/views/ops/db/DbList.vue @@ -7,17 +7,10 @@ >删除
- - - - - - - - - 查询 - - + + + + 查询
@@ -137,9 +130,7 @@ - - - + @@ -148,9 +139,9 @@ @@ -162,6 +153,19 @@ + + + + + + + @@ -215,6 +223,7 @@ import { formatByteSize } from '@/common/utils/format'; import DbEdit from './DbEdit.vue'; import CreateTable from './CreateTable.vue'; import { dbApi } from './api'; +import enums from './enums'; import { projectApi } from '../project/api.ts'; import SqlExecBox from './component/SqlExecBox.ts'; export default defineComponent({ @@ -254,10 +263,17 @@ export default defineComponent({ total: 0, query: { dbId: 0, + db: '', + table: '', + type: null, pageNum: 1, pageSize: 12, }, }, + rollbackSqlDialog: { + visible: false, + sql: '', + }, chooseTableName: '', tableInfoDialog: { visible: false, @@ -359,6 +375,9 @@ export default defineComponent({ state.sqlExecLogDialog.total = 0; state.sqlExecLogDialog.query.dbId = 0; state.sqlExecLogDialog.query.pageNum = 1; + state.sqlExecLogDialog.query.table = ''; + state.sqlExecLogDialog.query.db = ''; + state.sqlExecLogDialog.query.type = null; }; const searchSqlExecLog = async () => { @@ -372,6 +391,48 @@ export default defineComponent({ searchSqlExecLog(); }; + 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; + const oldValue = JSON.parse(sqlExecLog.oldValue); + + const rollbackSqls = []; + if (sqlExecLog.type == enums.DbSqlExecTypeEnum['UPDATE'].value) { + for (let ov of oldValue) { + const setItems = []; + for (let key in ov) { + if (key == primaryKey) { + continue; + } + setItems.push(`${key} = ${wrapValue(ov[key])}`); + } + rollbackSqls.push(`UPDATE ${sqlExecLog.table} SET ${setItems.join(', ')} WHERE ${primaryKey} = ${wrapValue(ov[primaryKey])};`); + } + } else if (sqlExecLog.type == enums.DbSqlExecTypeEnum['DELETE'].value) { + const columnNames = columns.map((c: any) => c.columnName); + for (let ov of oldValue) { + const values = []; + for (let column of columnNames) { + values.push(wrapValue(ov[column])); + } + rollbackSqls.push(`INSERT INTO ${sqlExecLog.table} (${columnNames.join(', ')}) VALUES (${values.join(', ')});`); + } + } + + state.rollbackSqlDialog.sql = rollbackSqls.join('\n'); + state.rollbackSqlDialog.visible = true; + }; + + /** + * 包装值,如果值类型为number则直接返回,其他则需要使用''包装 + */ + const wrapValue = (val: any) => { + if (typeof val == 'number') { + return val; + } + return `'${val}'`; + }; + const showTableInfo = async (row: any, db: string) => { state.tableInfoDialog.infos = await dbApi.tableInfos.request({ id: row.id, db }); state.dbId = row.id; @@ -441,7 +502,7 @@ export default defineComponent({ return { ...toRefs(state), - // enums, + enums, search, choose, handlePageChange, @@ -452,6 +513,7 @@ export default defineComponent({ onBeforeCloseSqlExecDialog, handleSqlExecPageChange, searchSqlExecLog, + onShowRollbackSql, showTableInfo, closeTableInfo, showColumns, 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 c00b3ea2..3788e900 100644 --- a/mayfly_go_web/src/views/ops/db/component/SqlExecDialog.vue +++ b/mayfly_go_web/src/views/ops/db/component/SqlExecDialog.vue @@ -1,8 +1,8 @@