From ce0ccd15cf728602b44292f2a3a6ccdaecc94e95 Mon Sep 17 00:00:00 2001 From: SwallowGG <1558143046@qq.com> Date: Sat, 14 Oct 2023 16:47:26 +0800 Subject: [PATCH] Add operation log --- .../server/domain/api/model/OperationLog.java | 27 ++++++++++ .../operation/OperationLogCreateParam.java | 26 ++++++++++ .../operation/OperationLogPageQueryParam.java | 15 ++++++ .../core/impl/DlTemplateServiceImpl.java | 52 ++++++++++++++++--- .../core/impl/OperationLogServiceImpl.java | 5 +- .../repository/entity/OperationLogDO.java | 30 ++++++++++- .../repository/mapper/OperationLogMapper.java | 4 +- .../db/migration/V2_1_4__OPERATION.sql | 3 ++ .../test/mybatis/MybatisGeneratorTest.java | 2 +- .../operation/log/OperationLogController.java | 1 + .../log/request/OperationLogQueryRequest.java | 15 ++++++ .../operation/log/vo/OperationLogVO.java | 30 +++++++++++ 12 files changed, 197 insertions(+), 13 deletions(-) create mode 100644 chat2db-server/chat2db-server-start/src/main/resources/db/migration/V2_1_4__OPERATION.sql diff --git a/chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/model/OperationLog.java b/chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/model/OperationLog.java index 39a18d24..9634f5ff 100644 --- a/chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/model/OperationLog.java +++ b/chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/model/OperationLog.java @@ -54,4 +54,31 @@ public class OperationLog { * ddl内容 */ private String ddl; + + + + /** + * 状态 + */ + private String status; + + /** + * 操作行数 + */ + private Long operationRows; + + /** + * 使用时长 + */ + private Long useTime; + + /** + * 扩展信息 + */ + private String extendInfo; + + /** + * schema名称 + */ + private String schemaName; } diff --git a/chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/param/operation/OperationLogCreateParam.java b/chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/param/operation/OperationLogCreateParam.java index ed80c6ec..77c60a58 100644 --- a/chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/param/operation/OperationLogCreateParam.java +++ b/chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/param/operation/OperationLogCreateParam.java @@ -34,4 +34,30 @@ public class OperationLogCreateParam { * ddl内容 */ private String ddl; + + + /** + * 状态 + */ + private String status; + + /** + * 操作行数 + */ + private Long operationRows; + + /** + * 使用时长 + */ + private Long useTime; + + /** + * 扩展信息 + */ + private String extendInfo; + + /** + * schema名称 + */ + private String schemaName; } diff --git a/chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/param/operation/OperationLogPageQueryParam.java b/chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/param/operation/OperationLogPageQueryParam.java index 5b2c01f4..ee6b099f 100644 --- a/chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/param/operation/OperationLogPageQueryParam.java +++ b/chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/param/operation/OperationLogPageQueryParam.java @@ -21,4 +21,19 @@ public class OperationLogPageQueryParam extends PageQueryParam { * 搜索关键词 */ private String searchKey; + + /** + * 数据源id + */ + private Long dataSourceId; + + /** + * 数据库名称 + */ + private String databaseName; + + /** + * schema名称 + */ + private String schemaName; } diff --git a/chat2db-server/chat2db-server-domain/chat2db-server-domain-core/src/main/java/ai/chat2db/server/domain/core/impl/DlTemplateServiceImpl.java b/chat2db-server/chat2db-server-domain/chat2db-server-domain-core/src/main/java/ai/chat2db/server/domain/core/impl/DlTemplateServiceImpl.java index d7491d54..9323d721 100644 --- a/chat2db-server/chat2db-server-domain/chat2db-server-domain-core/src/main/java/ai/chat2db/server/domain/core/impl/DlTemplateServiceImpl.java +++ b/chat2db-server/chat2db-server-domain/chat2db-server-domain-core/src/main/java/ai/chat2db/server/domain/core/impl/DlTemplateServiceImpl.java @@ -8,7 +8,10 @@ import java.util.List; import java.util.Optional; import ai.chat2db.server.domain.api.param.*; +import ai.chat2db.server.domain.api.param.operation.OperationLogCreateParam; +import ai.chat2db.server.domain.api.service.OperationLogService; import ai.chat2db.spi.MetaData; +import ai.chat2db.spi.sql.ConnectInfo; import com.alibaba.druid.DbType; import com.alibaba.druid.sql.PagerUtils; import com.alibaba.druid.sql.SQLUtils; @@ -35,6 +38,7 @@ import com.google.common.collect.Lists; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** @@ -46,15 +50,21 @@ import org.springframework.stereotype.Service; @Service public class DlTemplateServiceImpl implements DlTemplateService { + @Autowired + private OperationLogService operationLogService; + @Override public ListResult execute(DlExecuteParam param) { if (StringUtils.isBlank(param.getSql())) { return ListResult.empty(); } // 解析sql - RemoveSpecialGO(param); - DbType dbType = - JdbcUtils.parse2DruidDbType(Chat2DBContext.getConnectInfo().getDbType()); + String type = Chat2DBContext.getConnectInfo().getDbType(); + DbType dbType = JdbcUtils.parse2DruidDbType(type); + if ("SQLSERVER".equalsIgnoreCase(type)) { + RemoveSpecialGO(param); + } + List sqlList = SqlUtils.parse(param.getSql(), dbType); @@ -73,6 +83,7 @@ public class DlTemplateServiceImpl implements DlTemplateService { listResult.errorCode(executeResult.getDescription()); listResult.setErrorMessage(executeResult.getMessage()); } + addOperationLog(executeResult); } return listResult; } @@ -90,11 +101,12 @@ public class DlTemplateServiceImpl implements DlTemplateService { connection.setAutoCommit(false); for (String originalSql : sqlList) { ExecuteResult executeResult = SQLExecutor.getInstance().executeUpdate(originalSql, connection, 1); - dataResult.setData(executeResult); + dataResult.setData(executeResult); + addOperationLog(executeResult); } connection.commit(); - }catch (Exception e){ - log.error("executeUpdate error",e); + } catch (Exception e) { + log.error("executeUpdate error", e); dataResult.setSuccess(false); dataResult.setErrorCode("connection error"); dataResult.setErrorMessage(e.getMessage()); @@ -107,7 +119,7 @@ public class DlTemplateServiceImpl implements DlTemplateService { if (StringUtils.isBlank(sql)) { return; } - sql = sql.replaceAll("(?i)\\s*go\\s*", ";"); + sql = sql.replaceAll("(?mi)^[ \\t]*go[ \\t]*$", ";"); param.setSql(sql); } @@ -276,6 +288,9 @@ public class DlTemplateServiceImpl implements DlTemplateService { } private String getInsertSql(UpdateSelectResultParam param, List row, MetaData metaSchema) { + if (CollectionUtils.isEmpty(row)) { + return ""; + } StringBuilder script = new StringBuilder(); script.append("INSERT INTO ").append(metaSchema.getMetaDataName(param.getDatabaseName(), param.getSchemaName(), param.getTableName())) .append(" ("); @@ -301,6 +316,9 @@ public class DlTemplateServiceImpl implements DlTemplateService { private String getUpdateSql(UpdateSelectResultParam param, List row, List odlRow, MetaData metaSchema) { StringBuilder script = new StringBuilder(); + if (CollectionUtils.isEmpty(row) || CollectionUtils.isEmpty(odlRow)) { + return ""; + } script.append("UPDATE ").append(metaSchema.getMetaDataName(param.getDatabaseName(), param.getSchemaName(), param.getTableName())) .append(" set "); for (int i = 1; i < row.size(); i++) { @@ -336,4 +354,24 @@ public class DlTemplateServiceImpl implements DlTemplateService { return executeResult; } + private void addOperationLog(ExecuteResult executeResult) { + if (executeResult == null) { + return; + } + try { + ConnectInfo connectInfo = Chat2DBContext.getConnectInfo(); + OperationLogCreateParam createParam = new OperationLogCreateParam(); + createParam.setDdl(executeResult.getSql()); + createParam.setStatus(executeResult.getSuccess() ? "success" : "fail"); + createParam.setDatabaseName(connectInfo.getDatabaseName()); + createParam.setDataSourceId(connectInfo.getDataSourceId()); + createParam.setSchemaName(connectInfo.getSchemaName()); + createParam.setUseTime(executeResult.getDuration()); + createParam.setType(connectInfo.getDbType()); + createParam.setOperationRows(executeResult.getUpdateCount() != null ? Long.valueOf(executeResult.getUpdateCount()):null); + operationLogService.create(createParam); + } catch (Exception e) { + log.error("addOperationLog error:", e); + } + } } diff --git a/chat2db-server/chat2db-server-domain/chat2db-server-domain-core/src/main/java/ai/chat2db/server/domain/core/impl/OperationLogServiceImpl.java b/chat2db-server/chat2db-server-domain/chat2db-server-domain-core/src/main/java/ai/chat2db/server/domain/core/impl/OperationLogServiceImpl.java index eb7fdaa7..f14c0857 100644 --- a/chat2db-server/chat2db-server-domain/chat2db-server-domain-core/src/main/java/ai/chat2db/server/domain/core/impl/OperationLogServiceImpl.java +++ b/chat2db-server/chat2db-server-domain/chat2db-server-domain-core/src/main/java/ai/chat2db/server/domain/core/impl/OperationLogServiceImpl.java @@ -58,7 +58,10 @@ public class OperationLogServiceImpl implements OperationLogService { public PageResult queryPage(OperationLogPageQueryParam param) { EasyLambdaQueryWrapper queryWrapper = new EasyLambdaQueryWrapper<>(); queryWrapper.likeWhenPresent(OperationLogDO::getDdl, EasySqlUtils.buildLikeRightFuzzy(param.getSearchKey())) - .eqWhenPresent(OperationLogDO::getUserId, param.getUserId()) + .eqWhenPresent(OperationLogDO::getUserId, param.getUserId()) + .eqWhenPresent(OperationLogDO::getDataSourceId, param.getDataSourceId()) + .eqWhenPresent(OperationLogDO::getDatabaseName, param.getDatabaseName()) + .eqWhenPresent(OperationLogDO::getSchemaName, param.getSchemaName()) ; Integer start = param.getPageNo(); Integer offset = param.getPageSize(); diff --git a/chat2db-server/chat2db-server-domain/chat2db-server-domain-repository/src/main/java/ai/chat2db/server/domain/repository/entity/OperationLogDO.java b/chat2db-server/chat2db-server-domain/chat2db-server-domain-repository/src/main/java/ai/chat2db/server/domain/repository/entity/OperationLogDO.java index 4edc2536..719593b9 100644 --- a/chat2db-server/chat2db-server-domain/chat2db-server-domain-repository/src/main/java/ai/chat2db/server/domain/repository/entity/OperationLogDO.java +++ b/chat2db-server/chat2db-server-domain/chat2db-server-domain-repository/src/main/java/ai/chat2db/server/domain/repository/entity/OperationLogDO.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; import lombok.Getter; import lombok.Setter; @@ -13,8 +14,8 @@ import lombok.Setter; * 我的执行记录表 *

* - * @author ali-dbhub - * @since 2022-12-28 + * @author chat2db + * @since 2023-10-14 */ @Getter @Setter @@ -63,4 +64,29 @@ public class OperationLogDO implements Serializable { * 用户id */ private Long userId; + + /** + * 状态 + */ + private String status; + + /** + * 操作行数 + */ + private Long operationRows; + + /** + * 使用时长 + */ + private Long useTime; + + /** + * 扩展信息 + */ + private String extendInfo; + + /** + * schema名称 + */ + private String schemaName; } diff --git a/chat2db-server/chat2db-server-domain/chat2db-server-domain-repository/src/main/java/ai/chat2db/server/domain/repository/mapper/OperationLogMapper.java b/chat2db-server/chat2db-server-domain/chat2db-server-domain-repository/src/main/java/ai/chat2db/server/domain/repository/mapper/OperationLogMapper.java index ccc91268..94e2e625 100644 --- a/chat2db-server/chat2db-server-domain/chat2db-server-domain-repository/src/main/java/ai/chat2db/server/domain/repository/mapper/OperationLogMapper.java +++ b/chat2db-server/chat2db-server-domain/chat2db-server-domain-repository/src/main/java/ai/chat2db/server/domain/repository/mapper/OperationLogMapper.java @@ -8,8 +8,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; * 我的执行记录表 Mapper 接口 *

* - * @author ali-dbhub - * @since 2022-12-28 + * @author chat2db + * @since 2023-10-14 */ public interface OperationLogMapper extends BaseMapper { diff --git a/chat2db-server/chat2db-server-start/src/main/resources/db/migration/V2_1_4__OPERATION.sql b/chat2db-server/chat2db-server-start/src/main/resources/db/migration/V2_1_4__OPERATION.sql new file mode 100644 index 00000000..5eb246b1 --- /dev/null +++ b/chat2db-server/chat2db-server-start/src/main/resources/db/migration/V2_1_4__OPERATION.sql @@ -0,0 +1,3 @@ +ALTER TABLE `operation_log` + ADD COLUMN `schema_name` varchar(256) COMMENT 'schema名称'; +create INDEX idx_op_data_source_id on operation_log(data_source_id) ; \ No newline at end of file diff --git a/chat2db-server/chat2db-server-start/src/test/java/ai/chat2db/server/start/test/mybatis/MybatisGeneratorTest.java b/chat2db-server/chat2db-server-start/src/test/java/ai/chat2db/server/start/test/mybatis/MybatisGeneratorTest.java index 6e991296..e07c3c10 100644 --- a/chat2db-server/chat2db-server-start/src/test/java/ai/chat2db/server/start/test/mybatis/MybatisGeneratorTest.java +++ b/chat2db-server/chat2db-server-start/src/test/java/ai/chat2db/server/start/test/mybatis/MybatisGeneratorTest.java @@ -35,7 +35,7 @@ public class MybatisGeneratorTest extends BaseTest { //doGenerator(Lists.newArrayList("operation_saved")); //doGenerator(Lists.newArrayList("environment","data_source","team","team_dbhub_user","data_source_access", // "dbhub_user")); - doGenerator(Lists.newArrayList("table_cache")); + doGenerator(Lists.newArrayList("operation_log")); } private void doGenerator(List tableList) { diff --git a/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/operation/log/OperationLogController.java b/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/operation/log/OperationLogController.java index 5760a647..3ec810b0 100644 --- a/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/operation/log/OperationLogController.java +++ b/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/operation/log/OperationLogController.java @@ -66,4 +66,5 @@ public class OperationLogController { return operationLogService.create(param); } + } diff --git a/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/operation/log/request/OperationLogQueryRequest.java b/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/operation/log/request/OperationLogQueryRequest.java index 890ddb30..689a76d2 100644 --- a/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/operation/log/request/OperationLogQueryRequest.java +++ b/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/operation/log/request/OperationLogQueryRequest.java @@ -16,4 +16,19 @@ public class OperationLogQueryRequest extends PageQueryRequest { * 模糊词搜索 */ private String searchKey; + + /** + * 数据源id + */ + private Long dataSourceId; + + /** + * 数据库名称 + */ + private String databaseName; + + /** + * schema名称 + */ + private String schemaName; } diff --git a/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/operation/log/vo/OperationLogVO.java b/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/operation/log/vo/OperationLogVO.java index 7f57ebd5..8fd7ad42 100644 --- a/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/operation/log/vo/OperationLogVO.java +++ b/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/operation/log/vo/OperationLogVO.java @@ -45,4 +45,34 @@ public class OperationLogVO { * ddl语言类型 */ private String type; + + /** + * ddl内容 + */ + private String ddl; + + /** + * 状态 + */ + private String status; + + /** + * 操作行数 + */ + private Long operationRows; + + /** + * 使用时长 + */ + private Long useTime; + + /** + * 扩展信息 + */ + private String extendInfo; + + /** + * schema名称 + */ + private String schemaName; }