执行历史关联数据源,执行时长和影响条数展示

This commit is contained in:
暮光:城中城
2019-08-28 22:19:12 +08:00
parent 04f36bf3ad
commit 38e1f28305
11 changed files with 57 additions and 16 deletions

View File

@@ -23,6 +23,11 @@ public class DbHistory implements Serializable {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 数据源ID
*/
private Long datasourceId;
/**
* sql内容
*/
@@ -102,4 +107,12 @@ public class DbHistory implements Serializable {
", yn=" + yn +
"}";
}
public Long getDatasourceId() {
return datasourceId;
}
public void setDatasourceId(Long datasourceId) {
this.datasourceId = datasourceId;
}
}

View File

@@ -13,6 +13,6 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/
public interface DbHistoryService extends IService<DbHistory> {
void saveHistory(String content);
void saveHistory(String content, Long datasourceId);
}

View File

@@ -26,9 +26,10 @@ public class DbHistoryServiceImpl extends ServiceImpl<DbHistoryMapper, DbHistory
DbHistoryMapper dbHistoryMapper;
@Override
public void saveHistory(String content) {
public void saveHistory(String content, Long datasourceId) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
DbHistory dbHistory = new DbHistory();
dbHistory.setDatasourceId(datasourceId);
dbHistory.setContent(content);
dbHistory.setCreateTime(new Date());
dbHistory.setCreateUserId(currentUser.getUserId());

View File

@@ -82,8 +82,9 @@ public class DbSqlExecutorController {
}
@PostMapping(value = "/history/list")
public ResponseJson historyList() {
public ResponseJson historyList(Long sourceId) {
UpdateWrapper<DbHistory> wrapper = new UpdateWrapper<>();
wrapper.eq(sourceId != null, "datasource_id", sourceId);
wrapper.orderByDesc("id");
List<DbHistory> favoriteList = dbHistoryService.list(wrapper);
return DocDbResponseJson.ok(favoriteList);

View File

@@ -12,16 +12,19 @@ import java.util.Map;
*/
public class ExecuteResult {
private int updateCount;
private long useTime;
private List<Map<String, Object>> result;
public ExecuteResult() {
this.updateCount = 0;
this.useTime = 0;
this.result = Collections.emptyList();
}
public ExecuteResult(int updateCount, List<Map<String, Object>> result) {
public ExecuteResult(int updateCount, List<Map<String, Object>> result, long useTime) {
this.updateCount = updateCount;
this.result = result;
this.useTime = useTime;
}
public int getUpdateCount() {
@@ -39,4 +42,12 @@ public class ExecuteResult {
public void setResult(List<Map<String, Object>> result) {
this.result = result;
}
public long getUseTime() {
return useTime;
}
public void setUseTime(long useTime) {
this.useTime = useTime;
}
}

View File

@@ -81,13 +81,14 @@ public class SqlExecutor {
String sqlStr = SqlLogUtil.getSqlString(paramMap, boundSql);
logger.info("sql ==> {}", sqlStr);
// 保留历史记录
dbHistoryService.saveHistory(sqlStr);
dbHistoryService.saveHistory(sqlStr, factoryBean.getId());
List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
PreparedStatement preparedStatement = null;
DruidPooledConnection connection = null;
// 执行查询
try {
long startTime = System.currentTimeMillis();
connection = factoryBean.getDataSource().getConnection();
preparedStatement = connection.prepareStatement(sql);
// 设置当前的PreparedStatement
@@ -122,7 +123,8 @@ public class SqlExecutor {
// 更新的数量
int updateCount = preparedStatement.getUpdateCount();
updateCount = (updateCount < 0) ? 0 : updateCount;
return new ExecuteResult(updateCount, resultList);
long useTime = System.currentTimeMillis() - startTime;
return new ExecuteResult(updateCount, resultList, useTime);
} catch (Exception e) {
throw new RuntimeException(e);
} finally {

File diff suppressed because one or more lines are too long

View File

@@ -1,2 +1,2 @@
!function(e){function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}var r=window.webpackJsonp;window.webpackJsonp=function(t,c,u){for(var a,i,f,l=0,s=[];l<t.length;l++)i=t[l],o[i]&&s.push(o[i][0]),o[i]=0;for(a in c)Object.prototype.hasOwnProperty.call(c,a)&&(e[a]=c[a]);for(r&&r(t,c,u);s.length;)s.shift()();if(u)for(l=0;l<u.length;l++)f=n(n.s=u[l]);return f};var t={},o={2:0};n.e=function(e){function r(){a.onerror=a.onload=null,clearTimeout(i);var n=o[e];0!==n&&(n&&n[1](new Error("Loading chunk "+e+" failed.")),o[e]=void 0)}var t=o[e];if(0===t)return new Promise(function(e){e()});if(t)return t[2];var c=new Promise(function(n,r){t=o[e]=[n,r]});t[2]=c;var u=document.getElementsByTagName("head")[0],a=document.createElement("script");a.type="text/javascript",a.charset="utf-8",a.async=!0,a.timeout=12e4,n.nc&&a.setAttribute("nonce",n.nc),a.src=n.p+""+e+".js?"+{0:"a4e51a5424d256972972",1:"0a0403eb1820498dc9bc"}[e];var i=setTimeout(r,12e4);return a.onerror=a.onload=r,u.appendChild(a),c},n.m=e,n.c=t,n.i=function(e){return e},n.d=function(e,r,t){n.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:t})},n.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(r,"a",r),r},n.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},n.p="",n.oe=function(e){throw console.error(e),e}}([]);
//# sourceMappingURL=doc-db-manifest.js.map?852703c813fad5db2b75
!function(e){function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}var r=window.webpackJsonp;window.webpackJsonp=function(t,c,u){for(var i,a,f,l=0,s=[];l<t.length;l++)a=t[l],o[a]&&s.push(o[a][0]),o[a]=0;for(i in c)Object.prototype.hasOwnProperty.call(c,i)&&(e[i]=c[i]);for(r&&r(t,c,u);s.length;)s.shift()();if(u)for(l=0;l<u.length;l++)f=n(n.s=u[l]);return f};var t={},o={2:0};n.e=function(e){function r(){i.onerror=i.onload=null,clearTimeout(a);var n=o[e];0!==n&&(n&&n[1](new Error("Loading chunk "+e+" failed.")),o[e]=void 0)}var t=o[e];if(0===t)return new Promise(function(e){e()});if(t)return t[2];var c=new Promise(function(n,r){t=o[e]=[n,r]});t[2]=c;var u=document.getElementsByTagName("head")[0],i=document.createElement("script");i.type="text/javascript",i.charset="utf-8",i.async=!0,i.timeout=12e4,n.nc&&i.setAttribute("nonce",n.nc),i.src=n.p+""+e+".js?"+{0:"9104ba11e1fb6c27ed3d",1:"0a0403eb1820498dc9bc"}[e];var a=setTimeout(r,12e4);return i.onerror=i.onload=r,u.appendChild(i),c},n.m=e,n.c=t,n.i=function(e){return e},n.d=function(e,r,t){n.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:t})},n.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(r,"a",r),r},n.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},n.p="",n.oe=function(e){throw console.error(e),e}}([]);
//# sourceMappingURL=doc-db-manifest.js.map?1b2ff88d57049717469c

View File

@@ -8,7 +8,7 @@
<body>
<div id="app"></div>
<script type="text/javascript" src="doc-db-manifest.js?852703c813fad5db2b75"></script><script type="text/javascript" src="doc-db-vendor.js?0a0403eb1820498dc9bc"></script><script type="text/javascript" src="doc-db-index.js?a4e51a5424d256972972"></script></body>
<script type="text/javascript" src="doc-db-manifest.js?1b2ff88d57049717469c"></script><script type="text/javascript" src="doc-db-vendor.js?0a0403eb1820498dc9bc"></script><script type="text/javascript" src="doc-db-index.js?9104ba11e1fb6c27ed3d"></script></body>
</html>

View File

@@ -20,6 +20,7 @@ CREATE TABLE `db_favorite` (
CREATE TABLE `db_history` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键自增ID',
`datasource_id` bigint(20) NULL COMMENT '数据源ID',
`content` varchar(10000) DEFAULT NULL COMMENT 'sql内容',
`create_user_id` bigint(20) DEFAULT NULL COMMENT '创建人ID',
`create_user_name` varchar(20) DEFAULT NULL COMMENT '创建人名字',
@@ -37,5 +38,7 @@ VALUES ( 'DB_UPDATE_', '数据源增删改查权', 0, 1, '2019-08-18 23:25:17',
INSERT INTO `auth_info`(`auth_name`, `auth_desc`, `can_edit`, `create_uid`, `creation_time`, `auth_type`)
VALUES ( 'DB_DESC_EDIT_', '表字段注释修改权', 0, 1, '2019-08-18 23:25:17', 0);
-- ALTER TABLE `db_history` ADD COLUMN `datasource_id` bigint(0) NULL COMMENT '数据源ID';
-- ------------------------全新的库:------------------------

View File

@@ -15,6 +15,8 @@
<el-button v-if="sqlExecuting" v-on:click="cancelExecutorSql" type="primary" plain size="small" icon="el-icon-video-pause">取消执行</el-button>
<el-button v-else v-on:click="doExecutorSql" type="primary" plain size="small" icon="el-icon-video-play">执行</el-button>
<div style="float: right;">
<span v-if="!!executeUpdateCount" class="execute-use-time">影响行数{{executeUpdateCount}}</span>
<span v-if="!!executeUseTime" class="execute-use-time">查询时间{{executeUseTime/1000}}s</span>
<el-button v-on:click="addFavorite('')" plain size="small" icon="el-icon-star-off">收藏</el-button>
<el-button v-on:click="loadHistoryAndFavoriteList" plain size="small" icon="el-icon-tickets">收藏及历史</el-button>
</div>
@@ -25,7 +27,7 @@
{{executeError}}
</div>
<div v-else>
<el-table :data="executeResultList" stripe border style="width: 100%; margin-bottom: 5px;" class="execute-result-table" v-loading="sqlExecuting" height="600">
<el-table :data="executeResultList" stripe border style="width: 100%; margin-bottom: 5px;" class="execute-result-table" v-loading="sqlExecuting" max-height="600">
<el-table-column width="60px" v-if="executeResultCols.length > 0">
<template slot-scope="scope">{{scope.row._index}}</template>
</el-table-column>
@@ -42,7 +44,7 @@
<div style="padding: 10px;">
<el-tabs value="favorite">
<el-tab-pane label="我的收藏" name="favorite">
<el-table :data="myFavoriteList" stripe border style="width: 100%; margin-bottom: 5px;">
<el-table :data="myFavoriteList" stripe border style="width: 100%; margin-bottom: 5px;" v-infinite-scroll>
<!-- <el-table-column prop="name" label="标题"></el-table-column>-->
<el-table-column prop="content" label="SQL"></el-table-column>
<!-- <el-table-column prop="createTime" label="收藏时间" width="160px"></el-table-column>-->
@@ -93,6 +95,8 @@
sqlExecuting: false,
executeResultList: [],
executeResultCols: [],
executeUseTime: 0,
executeUpdateCount: 0,
sqlExecutorEditor: {},
nowExecutorId: 1,
executeError: "",
@@ -139,7 +143,7 @@
});
},
loadHistoryList() {
this.common.post(this.apilist1.historyList, {}, function (json) {
this.common.post(this.apilist1.historyList, {sourceId: this.choiceDatasourceId}, function (json) {
app.myHistoryListList = json.data || [];
});
},
@@ -173,6 +177,7 @@
return;
}
app.executeError = "";
app.executeUseTime = "";
app.executeResultList = [];
app.executeResultCols = [];
@@ -215,6 +220,8 @@
}
app.executeResultList = dataList;
app.executeResultCols = executeResultCols;
app.executeUseTime = resultData.useTime || 0;
app.executeUpdateCount = resultData.updateCount || 0;
});
},
loadDatasourceList() {
@@ -355,6 +362,9 @@
line-height: 25px;
padding: 0 5px;
}
.data-executor-vue .execute-use-time{
font-size: 12px;margin-right: 10px;
}
.data-executor-vue-out .el-tabs__nav-scroll{
padding-left: 20px;
}