From 8f1645ae4ea985fd2215e14e0fba81bd3ad29c2c Mon Sep 17 00:00:00 2001 From: taojinlong Date: Wed, 13 Nov 2024 18:18:53 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E6=95=B0=E6=8D=AE=E6=BA=90):=20API?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=BA=90=E6=94=AF=E6=8C=81=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E4=B8=BB=E9=94=AE=EF=BC=8C=E5=A2=9E=E9=87=8F=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E5=8F=AF=E6=A0=B9=E6=8D=AE=E4=B8=BB=E9=94=AE=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E5=B7=B2=E5=90=8C=E6=AD=A5=E7=9A=84=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../datasource/provider/ApiUtils.java | 15 +++- .../datasource/provider/H2EngineProvider.java | 33 +++++---- .../provider/MysqlEngineProvider.java | 32 ++++++--- core/core-frontend/src/locales/tw.ts | 1 + core/core-frontend/src/locales/zh-CN.ts | 2 + .../datasource/form/ApiHttpRequestDraw.vue | 69 +++++++++++++++++-- .../data/datasource/form/EditorDetail.vue | 12 ++-- .../visualized/data/datasource/form/index.vue | 8 ++- .../extensions/datasource/dto/TableField.java | 1 + 9 files changed, 138 insertions(+), 35 deletions(-) diff --git a/core/core-backend/src/main/java/io/dataease/datasource/provider/ApiUtils.java b/core/core-backend/src/main/java/io/dataease/datasource/provider/ApiUtils.java index 0a24304e26..b55cb447d1 100644 --- a/core/core-backend/src/main/java/io/dataease/datasource/provider/ApiUtils.java +++ b/core/core-backend/src/main/java/io/dataease/datasource/provider/ApiUtils.java @@ -44,6 +44,9 @@ public class ApiUtils { }; List apiDefinitionList = JsonUtil.parseList(datasourceRequest.getDatasource().getConfiguration(), listTypeReference); for (ApiDefinition apiDefinition : apiDefinitionList) { + if (apiDefinition == null) { + continue; + } if (StringUtils.isNotEmpty(apiDefinition.getType()) && apiDefinition.getType().equalsIgnoreCase("params")) { continue; } @@ -116,6 +119,9 @@ public class ApiUtils { List apiDefinitionList = JsonUtil.parseList(datasourceRequest.getDatasource().getConfiguration(), listTypeReference); List status = new ArrayList(); for (ApiDefinition apiDefinition : apiDefinitionList) { + if (apiDefinition == null) { + continue; + } datasourceRequest.setTable(apiDefinition.getName()); ObjectNode apiItemStatuses = objectMapper.createObjectNode(); try { @@ -573,6 +579,7 @@ public class ApiUtils { if (!ObjectUtils.isEmpty(o.get("jsonPath")) && StringUtils.isNotEmpty(field.getJsonPath()) && field.getJsonPath().equals(o.get("jsonPath").toString())) { o.put("checked", true); o.put("name", field.getName()); + o.put("primaryKey", field.isPrimaryKey()); o.put("deExtractType", field.getDeExtractType()); } } @@ -715,7 +722,7 @@ public class ApiUtils { } catch (Exception e) { DEException.throwException(e); } - return apiDefinitionListTemp.stream().filter(apiDefinition -> apiDefinition.getType() != null && apiDefinition.getType().equalsIgnoreCase("params")).collect(Collectors.toList()); + return apiDefinitionListTemp.stream().filter(apiDefinition -> apiDefinition != null && apiDefinition.getType() != null && apiDefinition.getType().equalsIgnoreCase("params")).collect(Collectors.toList()); } private static ApiDefinition checkApiDefinition(DatasourceRequest datasourceRequest) throws DEException { @@ -730,6 +737,9 @@ public class ApiUtils { } if (!CollectionUtils.isEmpty(apiDefinitionListTemp)) { for (ApiDefinition apiDefinition : apiDefinitionListTemp) { + if (apiDefinition == null) { + continue; + } if (apiDefinition.getDeTableName().equalsIgnoreCase(datasourceRequest.getTable()) || apiDefinition.getName().equalsIgnoreCase(datasourceRequest.getTable())) { apiDefinitionList.add(apiDefinition); } @@ -744,6 +754,9 @@ public class ApiUtils { } ApiDefinition find = null; for (ApiDefinition apiDefinition : apiDefinitionList) { + if (apiDefinition == null) { + continue; + } if (apiDefinition.getName().equalsIgnoreCase(datasourceRequest.getTable()) || apiDefinition.getDeTableName().equalsIgnoreCase(datasourceRequest.getTable())) { find = apiDefinition; } diff --git a/core/core-backend/src/main/java/io/dataease/datasource/provider/H2EngineProvider.java b/core/core-backend/src/main/java/io/dataease/datasource/provider/H2EngineProvider.java index e3c7a6bdf0..f63f418631 100644 --- a/core/core-backend/src/main/java/io/dataease/datasource/provider/H2EngineProvider.java +++ b/core/core-backend/src/main/java/io/dataease/datasource/provider/H2EngineProvider.java @@ -78,34 +78,43 @@ public class H2EngineProvider extends EngineProvider { } private String createTableSql(final List tableFields) { - StringBuilder Column_Fields = new StringBuilder("`"); + StringBuilder columnFields = new StringBuilder("`"); + StringBuilder key = new StringBuilder(); for (TableField tableField : tableFields) { - Column_Fields.append(tableField.getName()).append("` "); + if (tableField.isPrimaryKey()) { + key.append("`").append(tableField.getName()).append("`, "); + } + columnFields.append(tableField.getName()).append("` "); int size = tableField.getPrecision() * 4; switch (tableField.getDeType()) { case 0: - Column_Fields.append("varchar(2048)").append(",`"); + columnFields.append("varchar(2048)").append(",`"); break; case 1: - Column_Fields.append("varchar(2048)").append(",`"); + columnFields.append("varchar(2048)").append(",`"); break; case 2: - Column_Fields.append("bigint(20)").append(",`"); + columnFields.append("bigint(20)").append(",`"); break; case 3: - Column_Fields.append("varchar(100)").append(",`"); + columnFields.append("varchar(100)").append(",`"); break; case 4: - Column_Fields.append("TINYINT(length)".replace("length", String.valueOf(tableField.getPrecision()))).append(",`"); + columnFields.append("TINYINT(length)".replace("length", String.valueOf(tableField.getPrecision()))).append(",`"); break; default: - Column_Fields.append("varchar(2048)").append(",`"); + columnFields.append("varchar(2048)").append(",`"); break; } } - - Column_Fields = new StringBuilder(Column_Fields.substring(0, Column_Fields.length() - 2)); - Column_Fields = new StringBuilder("(" + Column_Fields + ")\n"); - return Column_Fields.toString(); + if (StringUtils.isEmpty(key.toString())) { + columnFields = new StringBuilder(columnFields.substring(0, columnFields.length() - 2)); + } else { + key = new StringBuilder(key.substring(0, key.length() - 2)); + columnFields = new StringBuilder(columnFields.substring(0, columnFields.length() - 1)); + columnFields.append("PRIMARY KEY (PRIMARYKEY)".replace("PRIMARYKEY", key.toString())); + } + columnFields = new StringBuilder("(" + columnFields + ")"); + return columnFields.toString(); } } diff --git a/core/core-backend/src/main/java/io/dataease/datasource/provider/MysqlEngineProvider.java b/core/core-backend/src/main/java/io/dataease/datasource/provider/MysqlEngineProvider.java index 7b2730ad9c..b45e28c5fd 100644 --- a/core/core-backend/src/main/java/io/dataease/datasource/provider/MysqlEngineProvider.java +++ b/core/core-backend/src/main/java/io/dataease/datasource/provider/MysqlEngineProvider.java @@ -83,34 +83,44 @@ public class MysqlEngineProvider extends EngineProvider { } private String createTableSql(final List tableFields) { - StringBuilder Column_Fields = new StringBuilder("`"); + StringBuilder columnFields = new StringBuilder("`"); + StringBuilder key = new StringBuilder(); for (TableField tableField : tableFields) { - Column_Fields.append(tableField.getName()).append("` "); + if (tableField.isPrimaryKey()) { + key.append("`").append(tableField.getName()).append("`, "); + } + columnFields.append(tableField.getName()).append("` "); int size = tableField.getPrecision() * 4; switch (tableField.getDeExtractType()) { case 0: - Column_Fields.append("varchar(1024)").append(",`"); + columnFields.append("varchar(1024)").append(",`"); break; case 1: - Column_Fields.append("datetime").append(",`"); + columnFields.append("datetime").append(",`"); break; case 2: - Column_Fields.append("bigint(20)").append(",`"); + columnFields.append("bigint(20)").append(",`"); break; case 3: - Column_Fields.append("decimal(27,8)").append(",`"); + columnFields.append("decimal(27,8)").append(",`"); break; case 4: - Column_Fields.append("TINYINT(length)".replace("length", String.valueOf(tableField.getPrecision()))).append(",`"); + columnFields.append("TINYINT(length)".replace("length", String.valueOf(tableField.getPrecision()))).append(",`"); break; default: - Column_Fields.append("varchar(1024)").append(",`"); + columnFields.append("varchar(1024)").append(",`"); break; } } + if (StringUtils.isEmpty(key.toString())) { + columnFields = new StringBuilder(columnFields.substring(0, columnFields.length() - 2)); + } else { + key = new StringBuilder(key.substring(0, key.length() - 2)); + columnFields = new StringBuilder(columnFields.substring(0, columnFields.length() - 1)); + columnFields.append("PRIMARY KEY (PRIMARYKEY)".replace("PRIMARYKEY", key.toString())); + } - Column_Fields = new StringBuilder(Column_Fields.substring(0, Column_Fields.length() - 2)); - Column_Fields = new StringBuilder("(" + Column_Fields + ")\n"); - return Column_Fields.toString(); + columnFields = new StringBuilder("(" + columnFields + ")"); + return columnFields.toString(); } } diff --git a/core/core-frontend/src/locales/tw.ts b/core/core-frontend/src/locales/tw.ts index 5a96278ce1..3a81c35dd5 100644 --- a/core/core-frontend/src/locales/tw.ts +++ b/core/core-frontend/src/locales/tw.ts @@ -1072,6 +1072,7 @@ export default { api_table_not_empty: 'API 數據表不能為空', has_repeat_name: 'API 數據表名稱重復', has_repeat_field_name: '字段名重復,請修改后再選擇', + primary_key_change: '主鍵不能改變:', api_field_not_empty: '字段不能為空', success_copy: '復制成功', valid: '有效', diff --git a/core/core-frontend/src/locales/zh-CN.ts b/core/core-frontend/src/locales/zh-CN.ts index 1154c1bf64..c06b2cac47 100644 --- a/core/core-frontend/src/locales/zh-CN.ts +++ b/core/core-frontend/src/locales/zh-CN.ts @@ -1072,6 +1072,7 @@ export default { api_table_not_empty: 'API 数据表不能为空', has_repeat_name: 'API 数据表名称重复', has_repeat_field_name: '字段名重复,请修改后再选择', + primary_key_change: '主键不能改变:', api_field_not_empty: '字段不能为空', success_copy: '复制成功', valid: '有效', @@ -1122,6 +1123,7 @@ export default { start_time: '开始时间', end_time: '结束时间', parse_filed: '解析字段', + set_key: '设为主键', field_rename: '重命名', select_type: '选择数据源类型', sync_table: '同步指定表', diff --git a/core/core-frontend/src/views/visualized/data/datasource/form/ApiHttpRequestDraw.vue b/core/core-frontend/src/views/visualized/data/datasource/form/ApiHttpRequestDraw.vue index 6b926ef8af..122e56e8e3 100644 --- a/core/core-frontend/src/views/visualized/data/datasource/form/ApiHttpRequestDraw.vue +++ b/core/core-frontend/src/views/visualized/data/datasource/form/ApiHttpRequestDraw.vue @@ -20,6 +20,7 @@ export interface Field { name: string value: Array<{}> checked: boolean + primaryKey: boolean children?: Array<{}> } @@ -46,6 +47,7 @@ export interface JsonField { children: null name: string checked: false + primaryKey: false extField: number jsonPath: string type: string @@ -61,6 +63,7 @@ const originFieldItem = reactive({ let apiItemList = reactive([]) let paramsList = reactive([]) +let fields = reactive([]) let apiItem = reactive({ status: '', @@ -157,13 +160,18 @@ const rule = reactive({ ] }) const activeName = ref('table') +const editItem = ref(false) provide('api-active-name', activeName) -const initApiItem = (val: ApiItem, from, name) => { +const initApiItem = (val: ApiItem, from, name, edit) => { activeName.value = name + editItem.value = edit apiItemList = from.apiConfiguration - paramsList = from.paramsConfiguration - if (val.type !== 'params') { - valueList.value = [] + fields = val.fields + if (from.paramsConfiguration) { + paramsList = from.paramsConfiguration + } + valueList.value = [] + if (val.type !== 'params' && paramsList) { for (let i = 0; i < paramsList.length; i++) { valueList.value = valueList.value.concat(paramsList[i].fields) } @@ -236,6 +244,7 @@ const saveItem = () => { } } } + for (let i = 0; i < apiItem.fields.length - 1; i++) { for (let j = i + 1; j < apiItem.fields.length; j++) { if (apiItem.fields[i].name === apiItem.fields[j].name) { @@ -244,6 +253,39 @@ const saveItem = () => { } } } + if (editItem.value) { + let msg = '' + for (let i = 0; i < apiItem.fields.length; i++) { + if (apiItem.fields[i].primaryKey) { + let find = false + for (let j = 0; j < fields.length - 1; j++) { + if (fields[j].name === apiItem.fields[i].name && fields[j].primaryKey) { + find = true + } + } + if (!find) { + msg = msg + ' ' + apiItem.fields[i].name + } + } + } + for (let i = 0; i < fields.length - 1; i++) { + if (fields[i].primaryKey) { + let find = false + for (let j = i + 1; j < apiItem.fields.length; j++) { + if (fields[i].name === apiItem.fields[j].name && apiItem.fields[j].primaryKey) { + find = true + } + } + if (!find) { + msg = msg + ' ' + fields[i].name + } + } + } + if (msg !== '') { + ElMessage.error(t('datasource.primary_key_change') + msg) + return + } + } returnAPIItem('returnItem', cloneDeep(apiItem)) edit_api_item.value = false } @@ -646,7 +688,7 @@ defineExpose({ + + + +

{ } const addApiItem = item => { let apiItem = null + let editItem = false api_table_title.value = t('datasource.data_table') if (item) { apiItem = cloneDeep(item) + editItem = true } else { apiItem = cloneDeep(defaultApiItem) apiItem.type = activeName.value @@ -400,14 +402,13 @@ const addApiItem = item => { ? form.value.apiConfiguration[form.value.apiConfiguration.length - 1].serialNumber + 1 : 0 let serialNumber2 = - form.value.paramsConfiguration.length > 0 + form.value.paramsConfiguration && form.value.paramsConfiguration.length > 0 ? form.value.paramsConfiguration[form.value.paramsConfiguration.length - 1].serialNumber + 1 : 0 - apiItem.serialNumber = serialNumber1 + serialNumber2 } nextTick(() => { - editApiItem.value.initApiItem(apiItem, form.value, activeName.value) + editApiItem.value.initApiItem(apiItem, form.value, activeName.value, editItem) }) } @@ -780,7 +781,10 @@ defineExpose({

- +