完善导入、导出功能:默认格式、输入框提示等

This commit is contained in:
datagear 2019-07-31 20:44:00 +08:00
parent 0f61a09d0c
commit 3e74ffa0ac
12 changed files with 96 additions and 49 deletions

View File

@ -28,9 +28,13 @@ import org.datagear.util.expression.ExpressionResolver;
*/
public class DataFormatContext
{
public static final String EXP_START_IDENTIFIER = ExpressionResolver.DEFAULT_START_IDENTIFIER_DOLLAR;
public static final String EXP_END_IDENTIFIER = ExpressionResolver.DEFAULT_END_IDENTIFIER;
private DataFormat dataFormat;
private ExpressionResolver expressionResolver = new ExpressionResolver();
private ExpressionResolver expressionResolver = new DataFormatExpressionResolver();
private Expression _dateExpression;
private Expression _timeExpression;
@ -594,4 +598,25 @@ public class DataFormatContext
return Base64.decodeBase64(value);
}
/**
* 将指定格式字符串包裹为表达式
*
* @param pattern
* @return
*/
public static String wrapToExpression(String pattern)
{
return EXP_START_IDENTIFIER + pattern + EXP_END_IDENTIFIER;
}
public static class DataFormatExpressionResolver extends ExpressionResolver
{
public DataFormatExpressionResolver()
{
super();
super.setStartIdentifier(EXP_START_IDENTIFIER);
super.setEndIdentifier(EXP_END_IDENTIFIER);
}
}
}

View File

@ -181,38 +181,41 @@ public abstract class AbstractDevotedDatabaseInfoResolver implements DevotedData
for (int i = 0; i < tables.length; i++)
{
String[] importedTables = null;
String[] importedTables = EMPTY_STRING_ARRAY;
// 处理重复表
for (int k = 0; i < i; k++)
if (tables[i] != null && !tables[i].isEmpty())
{
if (tables[k].equals(tables[i]))
// 处理重复表
for (int k = 0; i < i; k++)
{
importedTables = importedTabless[k];
break;
}
}
if (importedTables == null)
{
ImportedKeyInfo[] importedKeyInfos = getImportedKeyInfos(cn, metaData, schema, tables[i]);
if (importedKeyInfos == null || importedKeyInfos.length == 0)
importedTables = EMPTY_STRING_ARRAY;
else
{
List<String> importedTableList = new ArrayList<String>(2);
for (int j = 0; j < importedKeyInfos.length; j++)
if (tables[k].equals(tables[i]))
{
String importedTable = importedKeyInfos[j].getPkTableName();
if (!importedTableList.contains(importedTable))
importedTableList.add(importedTable);
importedTables = importedTabless[k];
break;
}
}
importedTables = new String[importedTableList.size()];
importedTableList.toArray(importedTables);
if (importedTables == null)
{
ImportedKeyInfo[] importedKeyInfos = getImportedKeyInfos(cn, metaData, schema, tables[i]);
if (importedKeyInfos == null || importedKeyInfos.length == 0)
importedTables = EMPTY_STRING_ARRAY;
else
{
List<String> importedTableList = new ArrayList<String>(2);
for (int j = 0; j < importedKeyInfos.length; j++)
{
String importedTable = importedKeyInfos[j].getPkTableName();
if (!importedTableList.contains(importedTable))
importedTableList.add(importedTable);
}
importedTables = new String[importedTableList.size()];
importedTableList.toArray(importedTables);
}
}
}

View File

@ -148,7 +148,7 @@ public interface DatabaseInfoResolver
/**
* 获取指定表的导入表外键依赖表
* <p>
* 如果某个索引的表没有导入表返回数组相应位置将是空数组
* 如果某个索引的表不存在或者没有导入表返回数组相应位置将是空数组
* </p>
*
* @param cn

View File

@ -42,6 +42,7 @@ import org.datagear.dataexchange.ConnectionFactory;
import org.datagear.dataexchange.DataExchange;
import org.datagear.dataexchange.DataExchangeService;
import org.datagear.dataexchange.DataFormat;
import org.datagear.dataexchange.DataFormatContext;
import org.datagear.dataexchange.DataImportOption;
import org.datagear.dataexchange.DataSourceConnectionFactory;
import org.datagear.dataexchange.FileOutputStreamResourceFactory;
@ -296,7 +297,7 @@ public class DataExchangeController extends AbstractSchemaConnController
}
}.execute();
resolveSubDataExchangeDependencies(subDataExchanges, numbers, dependentNumbers, "");
resolveSubDataExchangeDependencies(subDataExchanges, numbers, dependentNumbers);
Set<SubDataExchange> subDataExchangeSet = new HashSet<SubDataExchange>(subDataExchangeIds.length);
Collections.addAll(subDataExchangeSet, subDataExchanges);
@ -351,8 +352,7 @@ public class DataExchangeController extends AbstractSchemaConnController
@ResponseBody
public ResponseEntity<OperationMessage> imptSqlDoImport(HttpServletRequest request, HttpServletResponse response,
@PathVariable("schemaId") String schemaId, @RequestParam("dataExchangeId") String dataExchangeId,
SqlFileBatchDataImportForm dataImportForm,
@RequestParam(value = "dependentNumberNone", required = false) String dependentNumberNone) throws Exception
SqlFileBatchDataImportForm dataImportForm) throws Exception
{
if (dataImportForm == null || isEmpty(dataImportForm.getSubDataExchangeIds())
|| isEmpty(dataImportForm.getFileNames()) || isEmpty(dataImportForm.getFileEncoding())
@ -403,7 +403,7 @@ public class DataExchangeController extends AbstractSchemaConnController
subDataExchanges[i] = subDataExchange;
}
resolveSubDataExchangeDependencies(subDataExchanges, numbers, dependentNumbers, dependentNumberNone);
resolveSubDataExchangeDependencies(subDataExchanges, numbers, dependentNumbers);
Set<SubDataExchange> subDataExchangeSet = new HashSet<SubDataExchange>(subDataExchangeIds.length);
Collections.addAll(subDataExchangeSet, subDataExchanges);
@ -521,7 +521,7 @@ public class DataExchangeController extends AbstractSchemaConnController
}
}.execute();
resolveSubDataExchangeDependencies(subDataExchanges, numbers, dependentNumbers, "");
resolveSubDataExchangeDependencies(subDataExchanges, numbers, dependentNumbers);
Set<SubDataExchange> subDataExchangeSet = new HashSet<SubDataExchange>(subDataExchangeIds.length);
Collections.addAll(subDataExchangeSet, subDataExchanges);
@ -846,6 +846,11 @@ public class DataExchangeController extends AbstractSchemaConnController
}.execute();
DataFormat defaultDataFormat = new DataFormat();
defaultDataFormat.setDateFormat("'" + DataFormatContext.wrapToExpression(DataFormat.DEFAULT_DATE_FORMAT) + "'");
defaultDataFormat.setTimeFormat("'" + DataFormatContext.wrapToExpression(DataFormat.DEFAULT_TIME_FORMAT) + "'");
defaultDataFormat.setTimestampFormat(
"'" + DataFormatContext.wrapToExpression(DataFormat.DEFAULT_TIMESTAMP_FORMAT) + "'");
defaultDataFormat.setBinaryFormat("0x" + DataFormatContext.wrapToExpression(DataFormat.BINARY_FORMAT_HEX));
String dataExchangeId = IDUtil.uuid();
@ -1034,10 +1039,9 @@ public class DataExchangeController extends AbstractSchemaConnController
* @param subDataExchanges
* @param numbers
* @param dependentNumbers
* @param dependentNumberNone
*/
protected void resolveSubDataExchangeDependencies(SubDataExchange[] subDataExchanges, String[] numbers,
String[] dependentNumbers, String dependentNumberNone)
String[] dependentNumbers)
{
for (int i = 0; i < subDataExchanges.length; i++)
{
@ -1049,7 +1053,7 @@ public class DataExchangeController extends AbstractSchemaConnController
dependentNumber = dependentNumber.trim();
if (isEmpty(dependentNumber) || dependentNumber.equals(dependentNumberNone))
if (isEmpty(dependentNumber))
continue;
String[] myDependentNumbers = dependentNumber.split(",");
@ -1112,6 +1116,10 @@ public class DataExchangeController extends AbstractSchemaConnController
}
else
{
int extIndex = rawFileName.lastIndexOf('.');
if (extIndex >= 0 && extIndex < rawFileName.length() - 1)
serverFileName += "." + rawFileName.substring(extIndex + 1);
File importFile = FileUtil.getFile(directory, serverFileName);
InputStream in = null;

View File

@ -483,6 +483,7 @@ dataImport.number=\u7F16\u53F7
dataImport.dependentNumber=\u524D\u7F6E\u7F16\u53F7
dataImport.dependentNumber.none=\u65E0
dataImport.dependentNumber.auto=\u81EA\u52A8
dataImport.excel.importTableInput.placeholder=\u5DE5\u4F5C\u8868\u540D
dataExport.dataExport=\u5BFC\u51FA\u6570\u636E
dataExport.selectDataType=\u8BF7\u9009\u62E9\u5BFC\u51FA\u6570\u636E\u7C7B\u578B

View File

@ -109,6 +109,9 @@ Schema schema 数据库不允许为null
<script type="text/javascript">
(function(po)
{
po.element(".binaryFormatSetButtonHex").attr("value", "0x"+"$"+"{Hex}");
po.element(".binaryFormatSetButtonBase64").attr("value", "'"+"$"+"{Base64}'");
po.postBuildSubDataExchange = function(subDataExchange, tableName)
{
subDataExchange.tableName = tableName;

View File

@ -130,6 +130,8 @@ Schema schema 数据库不允许为null
<script type="text/javascript">
(function(po)
{
po.dependentNumberInputPlaceholder = "<@spring.message code='dataImport.dependentNumber.none' />";
po.postBuildSubDataExchange = function(subDataExchange)
{
subDataExchange.dependentNumber = "<@spring.message code='dataImport.dependentNumber.auto' />";

View File

@ -132,6 +132,8 @@ Schema schema 数据库不允许为null
<script type="text/javascript">
(function(po)
{
po.dependentNumberInputPlaceholder = "<@spring.message code='dataImport.dependentNumber.none' />";
po.postBuildSubDataExchange = function(subDataExchange)
{
subDataExchange.dependentNumber = "<@spring.message code='dataImport.dependentNumber.auto' />";
@ -152,7 +154,7 @@ Schema schema 数据库不允许为null
data : "tableName",
render : function(data, type, row, meta)
{
return "<input type='text' name='tableNames' value='"+$.escapeHtml(data)+"' class='table-name-input ui-widget ui-widget-content' style='width:90%' />";
return "<input type='text' name='tableNames' value='"+$.escapeHtml(data)+"' placeholder='<@spring.message code='dataImport.excel.importTableInput.placeholder' />' class='table-name-input ui-widget ui-widget-content' style='width:90%' />";
},
defaultContent: "",
width : "20%"

View File

@ -25,7 +25,6 @@ Schema schema 数据库不允许为null
<div class="content">
<form id="${pageId}-form" action="${contextPath}/dataexchange/${schema.id}/import/sql/doImport" method="POST">
<input type="hidden" name="dataExchangeId" value="${dataExchangeId}" />
<input type="hidden" name="dependentNumberNone" value="<@spring.message code='dataImport.dependentNumber.none' />" />
<div class="form-content form-content-wizard">
<h3><@spring.message code='dataImport.setDataFormat' /></h3>
<div>
@ -110,6 +109,8 @@ Schema schema 数据库不允许为null
<script type="text/javascript">
(function(po)
{
po.dependentNumberInputPlaceholder = "<@spring.message code='dataImport.dependentNumber.none' />";
po.cometdInitIfNot();
po.initDataImportSteps();
po.initDataExchangeUIs();

View File

@ -4,35 +4,35 @@ DataFormat defaultDataFormat 默认数据格式不允许为null
<div class="form-item">
<div class="form-item-label"><@spring.message code='dataExchange.dataFormat.dateFormat' /></div>
<div class="form-item-value">
<input type="text" name="dataFormat.dateFormat" value="${defaultDataFormat.dateFormat}" class="ui-widget ui-widget-content" />
<input type="text" name="dataFormat.dateFormat" value="${(defaultDataFormat.dateFormat)!''?html}" class="ui-widget ui-widget-content" />
</div>
</div>
<div class="form-item">
<div class="form-item-label"><@spring.message code='dataExchange.dataFormat.timeFormat' /></div>
<div class="form-item-value">
<input type="text" name="dataFormat.timeFormat" value="${defaultDataFormat.timeFormat}" class="ui-widget ui-widget-content" />
<input type="text" name="dataFormat.timeFormat" value="${(defaultDataFormat.timeFormat)!''?html}" class="ui-widget ui-widget-content" />
</div>
</div>
<div class="form-item">
<div class="form-item-label"><@spring.message code='dataExchange.dataFormat.timestampFormat' /></div>
<div class="form-item-value">
<input type="text" name="dataFormat.timestampFormat" value="${defaultDataFormat.timestampFormat}" class="ui-widget ui-widget-content" />
<input type="text" name="dataFormat.timestampFormat" value="${(defaultDataFormat.timestampFormat)!''?html}" class="ui-widget ui-widget-content" />
</div>
</div>
<div class="form-item">
<div class="form-item-label"><@spring.message code='dataExchange.dataFormat.numberFormat' /></div>
<div class="form-item-value">
<input type="text" name="dataFormat.numberFormat" value="${defaultDataFormat.numberFormat}" class="ui-widget ui-widget-content" />
<input type="text" name="dataFormat.numberFormat" value="${(defaultDataFormat.numberFormat)!''?html}" class="ui-widget ui-widget-content" />
</div>
</div>
<div class="form-item form-item-binaryFormat">
<div class="form-item-label"><@spring.message code='dataExchange.dataFormat.binaryFormat' /></div>
<div class="form-item-value">
<input type="text" name="dataFormat.binaryFormat" value="${defaultDataFormat.binaryFormat}" class="input-binaryFormat ui-widget ui-widget-content" />
<input type="text" name="dataFormat.binaryFormat" value="${(defaultDataFormat.binaryFormat)!''?html}" class="input-binaryFormat ui-widget ui-widget-content" />
<div id="${pageId}-binaryFormat">
<button type="button" class="binaryFormatSetButton" value="Hex"><@spring.message code='dataExchange.dataFormat.binaryFormat.HEX' /></button>
<button type="button" class="binaryFormatSetButton" value="Base4"><@spring.message code='dataExchange.dataFormat.binaryFormat.Base64' /></button>
<button type="button" class="binaryFormatSetButton" value="NULL"><@spring.message code='dataExchange.dataFormat.binaryFormat.NULL' /></button>
<button type="button" class="binaryFormatSetButton binaryFormatSetButtonHex" value="Hex"><@spring.message code='dataExchange.dataFormat.binaryFormat.HEX' /></button>
<button type="button" class="binaryFormatSetButton binaryFormatSetButtonBase64" value="Base64"><@spring.message code='dataExchange.dataFormat.binaryFormat.Base64' /></button>
<button type="button" class="binaryFormatSetButton binaryFormatSetButtonNULL" value="NULL"><@spring.message code='dataExchange.dataFormat.binaryFormat.NULL' /></button>
</div>
</div>
</div>

View File

@ -434,7 +434,6 @@ po.subDataExchangeStatusColumnIndex 子数据交换表格中状态列索引
{
po.element("input[name='dataFormat.binaryFormat']").val($(this).attr("value"));
});
$(po.element(".binaryFormatSetButton")[0]).click();
};
po.initDataExchangeActions = function()

View File

@ -12,6 +12,7 @@ dataExchange_js.ftl
(function(po)
{
po.dataExchangeChannelId = "${dataExchangeChannelId}";
po.dependentNumberInputPlaceholder = "";
po.addSubDataExchangesForFileInfos = function(fileInfos)
{
@ -22,7 +23,7 @@ dataExchange_js.ftl
{
fileInfos[i].subDataExchangeId = po.nextSubDataExchangeId();
fileInfos[i].number = po.currentSubDataExchangeId();
fileInfos[i].dependentNumber = "<@spring.message code='dataImport.dependentNumber.none' />";
fileInfos[i].dependentNumber = "";
po.postBuildSubDataExchange(fileInfos[i]);
}
@ -81,7 +82,9 @@ dataExchange_js.ftl
data : "dependentNumber",
render : function(data, type, row, meta)
{
return "<input type='text' name='dependentNumbers' value='"+$.escapeHtml(data)+"' class='table-dependent-number-input ui-widget ui-widget-content' style='width:90%' />";
return "<input type='text' name='dependentNumbers' value='"+$.escapeHtml(data)+"' "
+ (po.dependentNumberInputPlaceholder ? "placeholder='"+$.escapeHtml(po.dependentNumberInputPlaceholder)+"'" : "")
+ " class='table-dependent-number-input ui-widget ui-widget-content' style='width:90%' />";
},
defaultContent: "",
width : "10%"