From 47c39acb8dd7316c7f68d9cc08bbd7ed1ffb5330 Mon Sep 17 00:00:00 2001 From: junjie Date: Fri, 12 Mar 2021 17:49:41 +0800 Subject: [PATCH 01/17] =?UTF-8?q?feat(=E6=95=B0=E6=8D=AE=E9=9B=86):=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0SQL=EF=BC=8CUI=E5=88=9D=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/package.json | 1 + frontend/src/views/chart/view/ChartEdit.vue | 2 +- frontend/src/views/dataset/add/AddSQL.vue | 90 ++++++++++++++++++++- 3 files changed, 90 insertions(+), 3 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index 9cadee7c56..a4ecbb5dd3 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -28,6 +28,7 @@ "svg-sprite-loader": "4.1.3", "svgo": "1.2.2", "vue": "2.6.10", + "vue-codemirror": "^4.0.6", "vue-i18n": "7.3.2", "vue-router": "3.0.6", "vuedraggable": "^2.24.3", diff --git a/frontend/src/views/chart/view/ChartEdit.vue b/frontend/src/views/chart/view/ChartEdit.vue index 7aa484402d..1085f3d544 100644 --- a/frontend/src/views/chart/view/ChartEdit.vue +++ b/frontend/src/views/chart/view/ChartEdit.vue @@ -291,10 +291,10 @@ export default { this.removeCheckedKey(e) this.save() }, + // 右边往左边拖动时的事件 start2(e) { console.log(e) }, - // 右边往左边拖动时的事件 end2(e) { console.log(e) this.removeDuplicateKey(e) diff --git a/frontend/src/views/dataset/add/AddSQL.vue b/frontend/src/views/dataset/add/AddSQL.vue index 4d716fd4a4..f527948670 100644 --- a/frontend/src/views/dataset/add/AddSQL.vue +++ b/frontend/src/views/dataset/add/AddSQL.vue @@ -27,24 +27,84 @@ /> + + + + + + + + From 8d911cd4630ef205cbc30469925c0bf7ec230962 Mon Sep 17 00:00:00 2001 From: junjie Date: Mon, 15 Mar 2021 12:25:11 +0800 Subject: [PATCH 06/17] =?UTF-8?q?feat(=E6=95=B0=E6=8D=AE=E9=9B=86):=20?= =?UTF-8?q?=E5=AE=8C=E6=88=90=E6=B7=BB=E5=8A=A0SQL=E7=9A=84UI=E3=80=82?= =?UTF-8?q?=E4=BD=BF=E7=94=A8umy-ui=E6=9B=BF=E6=8D=A2element-ui=E4=B8=ADel?= =?UTF-8?q?-table=EF=BC=8C=E6=94=AF=E6=8C=81=E8=B6=85=E5=A4=9A=E8=A1=8C?= =?UTF-8?q?=E3=80=81=E5=88=97=EF=BC=88=E4=B8=8A=E4=B8=87=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=EF=BC=89=E7=9A=84table=E8=99=9A=E6=8B=9F=EF=BC=8Cgrid=E8=99=9A?= =?UTF-8?q?=E6=8B=9F=EF=BC=8Ctable=E4=B8=8D=E4=BC=9A=E5=8D=A1=E9=A1=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dataset/DataSetTableController.java | 5 + .../provider/DatasourceProvider.java | 7 ++ .../datasource/provider/JdbcProvider.java | 75 ++++++++++----- .../service/dataset/DataSetTableService.java | 32 ++++++- frontend/package.json | 1 + frontend/src/lang/zh.js | 3 +- frontend/src/main.js | 4 + .../src/views/chart/components/QuotaItem.vue | 2 +- frontend/src/views/chart/view/ChartEdit.vue | 10 +- frontend/src/views/dataset/add/AddSQL.vue | 91 ++++++++++++++++--- .../src/views/dataset/data/TabDataPreview.vue | 26 ++++-- 11 files changed, 204 insertions(+), 52 deletions(-) diff --git a/backend/src/main/java/io/dataease/controller/dataset/DataSetTableController.java b/backend/src/main/java/io/dataease/controller/dataset/DataSetTableController.java index 5660a44244..827386e0bb 100644 --- a/backend/src/main/java/io/dataease/controller/dataset/DataSetTableController.java +++ b/backend/src/main/java/io/dataease/controller/dataset/DataSetTableController.java @@ -65,4 +65,9 @@ public class DataSetTableController { public Map getPreviewData(@RequestBody DataSetTableRequest dataSetTableRequest) throws Exception { return dataSetTableService.getPreviewData(dataSetTableRequest); } + + @PostMapping("sqlPreview") + public Map getSQLPreview(@RequestBody DataSetTableRequest dataSetTableRequest) throws Exception { + return dataSetTableService.getSQLPreview(dataSetTableRequest); + } } diff --git a/backend/src/main/java/io/dataease/datasource/provider/DatasourceProvider.java b/backend/src/main/java/io/dataease/datasource/provider/DatasourceProvider.java index d1dc06956d..1339ac63ac 100644 --- a/backend/src/main/java/io/dataease/datasource/provider/DatasourceProvider.java +++ b/backend/src/main/java/io/dataease/datasource/provider/DatasourceProvider.java @@ -4,6 +4,7 @@ import io.dataease.base.domain.Datasource; import io.dataease.datasource.dto.TableFiled; import io.dataease.datasource.request.DatasourceRequest; +import java.sql.ResultSet; import java.util.ArrayList; import java.util.List; @@ -13,6 +14,8 @@ public abstract class DatasourceProvider { abstract public List getData(DatasourceRequest datasourceRequest) throws Exception; + abstract public ResultSet getDataResultSet(DatasourceRequest datasourceRequest) throws Exception; + abstract public List getTables(DatasourceRequest datasourceRequest) throws Exception; public List getTableFileds(DatasourceRequest datasourceRequest) throws Exception{ @@ -27,4 +30,8 @@ public abstract class DatasourceProvider { abstract public List getPageData(DatasourceRequest datasourceRequest) throws Exception; + abstract public List fetchResult(ResultSet rs) throws Exception; + + abstract public List fetchResultField(ResultSet rs) throws Exception; + } diff --git a/backend/src/main/java/io/dataease/datasource/provider/JdbcProvider.java b/backend/src/main/java/io/dataease/datasource/provider/JdbcProvider.java index 4b53abfb49..d015063659 100644 --- a/backend/src/main/java/io/dataease/datasource/provider/JdbcProvider.java +++ b/backend/src/main/java/io/dataease/datasource/provider/JdbcProvider.java @@ -8,12 +8,13 @@ import io.dataease.datasource.dto.TableFiled; import io.dataease.datasource.request.DatasourceRequest; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; + import java.sql.*; import java.text.MessageFormat; import java.util.*; @Service("jdbc") -public class JdbcProvider extends DatasourceProvider{ +public class JdbcProvider extends DatasourceProvider { @Override @@ -25,33 +26,48 @@ public class JdbcProvider extends DatasourceProvider{ ResultSet rs = stat.executeQuery(datasourceRequest.getQuery()) ) { list = fetchResult(rs); - } catch (SQLException e){ + } catch (SQLException e) { throw new Exception("ERROR:" + e.getMessage(), e); - }catch (Exception e) { + } catch (Exception e) { throw new Exception("ERROR:" + e.getMessage(), e); } return list; } + @Override + public ResultSet getDataResultSet(DatasourceRequest datasourceRequest) throws Exception { + ResultSet rs; + try { + Connection connection = getConnection(datasourceRequest); + Statement stat = connection.createStatement(); + rs = stat.executeQuery(datasourceRequest.getQuery()); + } catch (SQLException e) { + throw new Exception("ERROR:" + e.getMessage(), e); + } catch (Exception e) { + throw new Exception("ERROR:" + e.getMessage(), e); + } + return rs; + } + @Override public List getPageData(DatasourceRequest datasourceRequest) throws Exception { List list = new LinkedList<>(); try ( Connection connection = getConnection(datasourceRequest); Statement stat = connection.createStatement(); - ResultSet rs = stat.executeQuery(datasourceRequest.getQuery() + MessageFormat.format(" LIMIT {0}, {1}", (datasourceRequest.getStartPage() -1)*datasourceRequest.getPageSize(), datasourceRequest.getPageSize())) + ResultSet rs = stat.executeQuery(datasourceRequest.getQuery() + MessageFormat.format(" LIMIT {0}, {1}", (datasourceRequest.getStartPage() - 1) * datasourceRequest.getPageSize(), datasourceRequest.getPageSize())) ) { list = fetchResult(rs); - } catch (SQLException e){ + } catch (SQLException e) { throw new Exception("ERROR:" + e.getMessage(), e); - }catch (Exception e) { + } catch (Exception e) { throw new Exception("ERROR:" + e.getMessage(), e); } return list; } - - private List fetchResult( ResultSet rs) throws Exception{ + @Override + public List fetchResult(ResultSet rs) throws Exception { List list = new LinkedList<>(); ResultSetMetaData metaData = rs.getMetaData(); int columnCount = metaData.getColumnCount(); @@ -73,13 +89,24 @@ public class JdbcProvider extends DatasourceProvider{ return list; } + @Override + public List fetchResultField(ResultSet rs) throws Exception { + List fieldList = new ArrayList<>(); + ResultSetMetaData metaData = rs.getMetaData(); + int columnCount = metaData.getColumnCount(); + for (int j = 0; j < columnCount; j++) { + fieldList.add(metaData.getColumnName(j + 1)); + } + return fieldList; + } + @Override public List getTables(DatasourceRequest datasourceRequest) throws Exception { List tables = new ArrayList<>(); String queryStr = getTablesSql(datasourceRequest); try (Connection con = getConnection(datasourceRequest); Statement ps = con.createStatement()) { ResultSet resultSet = ps.executeQuery(queryStr); - while (resultSet.next()){ + while (resultSet.next()) { tables.add(resultSet.getString(1)); } } catch (Exception e) { @@ -89,22 +116,22 @@ public class JdbcProvider extends DatasourceProvider{ } @Override - public List getTableFileds(DatasourceRequest datasourceRequest) throws Exception{ + public List getTableFileds(DatasourceRequest datasourceRequest) throws Exception { List list = new LinkedList<>(); try ( - Connection connection = getConnection(datasourceRequest); + Connection connection = getConnection(datasourceRequest); ) { DatabaseMetaData databaseMetaData = connection.getMetaData(); ResultSet resultSet = databaseMetaData.getColumns(null, "%", datasourceRequest.getTable().toUpperCase(), "%"); while (resultSet.next()) { String tableName = resultSet.getString("TABLE_NAME"); String database = resultSet.getString("TABLE_CAT"); - if(tableName.equals(datasourceRequest.getTable()) && database.equalsIgnoreCase(getDatabase(datasourceRequest))){ + if (tableName.equals(datasourceRequest.getTable()) && database.equalsIgnoreCase(getDatabase(datasourceRequest))) { TableFiled tableFiled = new TableFiled(); String colName = resultSet.getString("COLUMN_NAME"); tableFiled.setFieldName(colName); String remarks = resultSet.getString("REMARKS"); - if(remarks == null || remarks.equals("")){ + if (remarks == null || remarks.equals("")) { remarks = colName; } tableFiled.setRemarks(remarks); @@ -113,13 +140,15 @@ public class JdbcProvider extends DatasourceProvider{ list.add(tableFiled); } } - } catch (SQLException e){ + } catch (SQLException e) { throw new Exception("ERROR:" + e.getMessage(), e); - }catch (Exception e) { + } catch (Exception e) { throw new Exception("ERROR:" + e.getMessage(), e); } return list; - }; + } + + ; @Override public void test(DatasourceRequest datasourceRequest) throws Exception { @@ -132,7 +161,7 @@ public class JdbcProvider extends DatasourceProvider{ } - public Long count(DatasourceRequest datasourceRequest)throws Exception{ + public Long count(DatasourceRequest datasourceRequest) throws Exception { try (Connection con = getConnection(datasourceRequest); Statement ps = con.createStatement()) { ResultSet resultSet = ps.executeQuery(datasourceRequest.getQuery()); while (resultSet.next()) { @@ -150,16 +179,16 @@ public class JdbcProvider extends DatasourceProvider{ String driver = null; String jdbcurl = null; DatasourceTypes datasourceType = DatasourceTypes.valueOf(datasourceRequest.getDatasource().getType()); - switch (datasourceType){ + switch (datasourceType) { case mysql: - MysqlConfigrationDTO mysqlConfigrationDTO = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), MysqlConfigrationDTO.class); + MysqlConfigrationDTO mysqlConfigrationDTO = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), MysqlConfigrationDTO.class); username = mysqlConfigrationDTO.getUsername(); password = mysqlConfigrationDTO.getPassword(); driver = mysqlConfigrationDTO.getDriver(); jdbcurl = mysqlConfigrationDTO.getJdbc(); break; case sqlServer: - SqlServerConfigration sqlServerConfigration= new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), SqlServerConfigration.class); + SqlServerConfigration sqlServerConfigration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), SqlServerConfigration.class); username = sqlServerConfigration.getUsername(); password = sqlServerConfigration.getPassword(); driver = sqlServerConfigration.getDriver(); @@ -178,7 +207,7 @@ public class JdbcProvider extends DatasourceProvider{ return DriverManager.getConnection(jdbcurl, props); } - private String getDatabase(DatasourceRequest datasourceRequest){ + private String getDatabase(DatasourceRequest datasourceRequest) { DatasourceTypes datasourceType = DatasourceTypes.valueOf(datasourceRequest.getDatasource().getType()); switch (datasourceType) { case mysql: @@ -192,9 +221,9 @@ public class JdbcProvider extends DatasourceProvider{ } } - private String getTablesSql(DatasourceRequest datasourceRequest){ + private String getTablesSql(DatasourceRequest datasourceRequest) { DatasourceTypes datasourceType = DatasourceTypes.valueOf(datasourceRequest.getDatasource().getType()); - switch (datasourceType){ + switch (datasourceType) { case mysql: return "show tables;"; case sqlServer: diff --git a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java index 518042cb89..b74124be9f 100644 --- a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java +++ b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java @@ -21,6 +21,7 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.sql.ResultSet; import java.text.MessageFormat; import java.util.*; import java.util.stream.Collectors; @@ -150,7 +151,7 @@ public class DataSetTableService { List fields = dataSetTableFieldsService.list(datasetTableField); String[] fieldArray = fields.stream().map(DatasetTableField::getOriginName).toArray(String[]::new); - datasourceRequest.setQuery(createQuerySQL(ds.getType(), table, fieldArray) + " LIMIT 0,10"); + datasourceRequest.setQuery(createQuerySQL(ds.getType(), table, fieldArray) + " LIMIT 0,10");// todo limit List data = new ArrayList<>(); try { @@ -177,6 +178,35 @@ public class DataSetTableService { return map; } + public Map getSQLPreview(DataSetTableRequest dataSetTableRequest) throws Exception { + Datasource ds = datasourceMapper.selectByPrimaryKey(dataSetTableRequest.getDataSourceId()); + DatasourceProvider datasourceProvider = ProviderFactory.getProvider(ds.getType()); + DatasourceRequest datasourceRequest = new DatasourceRequest(); + datasourceRequest.setDatasource(ds); + String sql = new Gson().fromJson(dataSetTableRequest.getInfo(), DataTableInfoDTO.class).getSql(); + datasourceRequest.setQuery(sql); + ResultSet dataResultSet = datasourceProvider.getDataResultSet(datasourceRequest); + List data = datasourceProvider.fetchResult(dataResultSet); + List fields = datasourceProvider.fetchResultField(dataResultSet); + + List> jsonArray = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(data)) { + jsonArray = data.stream().map(ele -> { + Map map = new HashMap<>(); + for (int i = 0; i < ele.length; i++) { + map.put(fields.get(i), ele[i]); + } + return map; + }).collect(Collectors.toList()); + } + + Map map = new HashMap<>(); + map.put("fields", fields); + map.put("data", jsonArray); + + return map; + } + public List getDataSetData(String datasourceId, String table, List fields) { List data = new ArrayList<>(); Datasource ds = datasourceMapper.selectByPrimaryKey(datasourceId); diff --git a/frontend/package.json b/frontend/package.json index a4ecbb5dd3..194e165f0f 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -27,6 +27,7 @@ "screenfull": "4.2.0", "svg-sprite-loader": "4.1.3", "svgo": "1.2.2", + "umy-ui": "^1.1.6", "vue": "2.6.10", "vue-codemirror": "^4.0.6", "vue-i18n": "7.3.2", diff --git a/frontend/src/lang/zh.js b/frontend/src/lang/zh.js index 82175f45d0..539eef1de9 100644 --- a/frontend/src/lang/zh.js +++ b/frontend/src/lang/zh.js @@ -666,7 +666,8 @@ export default { close: '关闭', required: '必填', input_content: '请输入内容', - add_sql_table: '添加SQL' + add_sql_table: '添加SQL', + preview: '预览' }, datasource: { create: '新建数据连接', diff --git a/frontend/src/main.js b/frontend/src/main.js index b5ddc1e834..f7270d1b94 100644 --- a/frontend/src/main.js +++ b/frontend/src/main.js @@ -28,6 +28,10 @@ import * as echarts from 'echarts' Vue.prototype.$echarts = echarts +import UmyUi from 'umy-ui' +import 'umy-ui/lib/theme-chalk/index.css'// 引入样式 +Vue.use(UmyUi) + /** * If you don't want to use mock-server * you want to use MockJs for mock api diff --git a/frontend/src/views/chart/components/QuotaItem.vue b/frontend/src/views/chart/components/QuotaItem.vue index dcf0f26220..c616da6676 100644 --- a/frontend/src/views/chart/components/QuotaItem.vue +++ b/frontend/src/views/chart/components/QuotaItem.vue @@ -3,7 +3,7 @@ - {{ item.name }}{{ $t('chart.'+item.summary) }} + {{ item.name }}{{ $t('chart.'+item.summary) }} diff --git a/frontend/src/views/chart/view/ChartEdit.vue b/frontend/src/views/chart/view/ChartEdit.vue index 1085f3d544..5163cf3d7c 100644 --- a/frontend/src/views/chart/view/ChartEdit.vue +++ b/frontend/src/views/chart/view/ChartEdit.vue @@ -394,8 +394,8 @@ export default { } .item { - padding: 3px 10px; - margin: 3px 3px 0 3px; + padding: 2px 10px; + margin: 2px 2px 0 2px; border: solid 1px #eee; text-align: left; color: #606266; @@ -403,15 +403,15 @@ export default { } .item-on-move { - padding: 3px 10px; - margin: 3px 3px 0 3px; + padding: 2px 10px; + margin: 2px 2px 0 2px; border: solid 1px #eee; text-align: left; color: #606266; } .item + .item { - margin-top: 3px; + margin-top: 2px; } .item:hover { diff --git a/frontend/src/views/dataset/add/AddSQL.vue b/frontend/src/views/dataset/add/AddSQL.vue index fc29f85146..d55f8296e2 100644 --- a/frontend/src/views/dataset/add/AddSQL.vue +++ b/frontend/src/views/dataset/add/AddSQL.vue @@ -28,7 +28,11 @@ - + + + + {{ $t('dataset.direct_connect') }} + {{ $t('dataset.sync_data') }} @@ -45,12 +49,38 @@ /> + + +
+ {{ $t('dataset.data_preview') }} + {{ $t('dataset.preview') }} +
+
+ + + +
+
+
+ + diff --git a/frontend/src/views/system/dept/index.vue b/frontend/src/views/system/dept/index.vue index 2e9b5d8cc9..e9aaeb5f17 100644 --- a/frontend/src/views/system/dept/index.vue +++ b/frontend/src/views/system/dept/index.vue @@ -1,7 +1,7 @@