Compare commits
25 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7713210044 | ||
|
|
0fc632915d | ||
|
|
93e4abeb9a | ||
|
|
7d25fdf8cd | ||
|
|
c7d0415c54 | ||
|
|
64adee61f5 | ||
|
|
5a56b87acd | ||
|
|
91cbc4abd4 | ||
|
|
be61ae643b | ||
|
|
08d3b26deb | ||
|
|
dec58a71ba | ||
|
|
466f8d4ce5 | ||
|
|
832d74f12f | ||
|
|
5f611d3e39 | ||
|
|
ba59aa4158 | ||
|
|
52e2faa157 | ||
|
|
13ca0954e6 | ||
|
|
3251396f86 | ||
|
|
b98d873c16 | ||
|
|
04179b2534 | ||
|
|
e44acadabc | ||
|
|
48370a3dbb | ||
|
|
b5d4ec737f | ||
|
|
60babbf91d | ||
|
|
b013190d6c |
@ -5,7 +5,7 @@
|
||||
<parent>
|
||||
<artifactId>dataease-server</artifactId>
|
||||
<groupId>io.dataease</groupId>
|
||||
<version>1.11.1</version>
|
||||
<version>1.11.3</version>
|
||||
</parent>
|
||||
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
@ -241,17 +241,17 @@
|
||||
<dependency>
|
||||
<groupId>io.dataease</groupId>
|
||||
<artifactId>dataease-plugin-interface</artifactId>
|
||||
<version>1.11.1</version>
|
||||
<version>1.11.3</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.dataease</groupId>
|
||||
<artifactId>dataease-plugin-view</artifactId>
|
||||
<version>1.11.1</version>
|
||||
<version>1.11.3</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.dataease</groupId>
|
||||
<artifactId>dataease-plugin-datasource</artifactId>
|
||||
<version>1.11.1</version>
|
||||
<version>1.11.3</version>
|
||||
</dependency>
|
||||
|
||||
|
||||
|
||||
@ -49,7 +49,8 @@ public class DataSetTableController {
|
||||
|
||||
@DePermissions(value = {
|
||||
@DePermission(type = DePermissionType.DATASET, value = "id", level = ResourceAuthLevel.DATASET_LEVEL_MANAGE),
|
||||
@DePermission(type = DePermissionType.DATASET, value = "sceneId", level = ResourceAuthLevel.DATASET_LEVEL_MANAGE)
|
||||
@DePermission(type = DePermissionType.DATASET, value = "sceneId", level = ResourceAuthLevel.DATASET_LEVEL_MANAGE),
|
||||
@DePermission(type = DePermissionType.DATASOURCE, value = "dataSourceId", level = ResourceAuthLevel.DATASOURCE_LEVEL_USE)
|
||||
}, logical = Logical.AND)
|
||||
@ApiOperation("更新")
|
||||
@PostMapping("update")
|
||||
@ -135,6 +136,10 @@ public class DataSetTableController {
|
||||
|
||||
@ApiOperation("根据sql查询预览数据")
|
||||
@PostMapping("sqlPreview")
|
||||
@DePermissions(value = {
|
||||
@DePermission(type = DePermissionType.DATASET, value = "id", level = ResourceAuthLevel.DATASET_LEVEL_USE),
|
||||
@DePermission(type = DePermissionType.DATASOURCE, value = "dataSourceId", level = ResourceAuthLevel.DATASOURCE_LEVEL_USE)
|
||||
}, logical = Logical.AND)
|
||||
public Map<String, Object> getSQLPreview(@RequestBody DataSetTableRequest dataSetTableRequest) throws Exception {
|
||||
return dataSetTableService.getSQLPreview(dataSetTableRequest);
|
||||
}
|
||||
|
||||
@ -17,6 +17,8 @@ public class PanelTemplateRequest extends PanelTemplateWithBLOBs {
|
||||
private String withBlobs="Y";
|
||||
@ApiModelProperty("操作类型")
|
||||
private String optType;
|
||||
@ApiModelProperty("静态文件")
|
||||
private String staticResource;
|
||||
@ApiModelProperty("是否及联")
|
||||
private Boolean withChildren = false;
|
||||
|
||||
|
||||
@ -10,6 +10,7 @@ import io.dataease.controller.sys.request.PluginStatus;
|
||||
import io.dataease.service.sys.PluginService;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import org.apache.shiro.authz.annotation.RequiresPermissions;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
@ -29,6 +30,7 @@ public class SysPluginController {
|
||||
|
||||
@ApiOperation("查询已安装插件")
|
||||
@PostMapping("/pluginGrid/{goPage}/{pageSize}")
|
||||
@RequiresPermissions("plugin:read")
|
||||
public Pager<List<MyPlugin>> pluginGrid(@PathVariable int goPage, @PathVariable int pageSize, @RequestBody BaseGridRequest request) {
|
||||
Page<Object> page = PageHelper.startPage(goPage, pageSize, true);
|
||||
return PageUtils.setPageInfo(page, pluginService.query(request));
|
||||
@ -36,19 +38,21 @@ public class SysPluginController {
|
||||
|
||||
@ApiOperation("安装插件")
|
||||
@PostMapping("upload")
|
||||
@RequiresPermissions("plugin:upload")
|
||||
public Map<String, Object> localUpload(@RequestParam("file") MultipartFile file) throws Exception {
|
||||
return pluginService.localInstall(file);
|
||||
}
|
||||
|
||||
@ApiOperation("卸载插件")
|
||||
@PostMapping("/uninstall/{pluginId}")
|
||||
@RequiresPermissions("plugin:uninstall")
|
||||
public Boolean unInstall(@PathVariable Long pluginId) {
|
||||
return pluginService.uninstall(pluginId);
|
||||
}
|
||||
|
||||
@ApiOperation("切换插件状态")
|
||||
@PostMapping("/changeStatus")
|
||||
public Boolean changeStatus(@RequestBody PluginStatus pluginStatus) {
|
||||
return pluginService.changeStatus(pluginStatus.getPluginId(), pluginStatus.getStatus());
|
||||
}
|
||||
// @ApiOperation("切换插件状态")
|
||||
// @PostMapping("/changeStatus")
|
||||
// public Boolean changeStatus(@RequestBody PluginStatus pluginStatus) {
|
||||
// return pluginService.changeStatus(pluginStatus.getPluginId(), pluginStatus.getStatus());
|
||||
// }
|
||||
}
|
||||
|
||||
@ -27,6 +27,7 @@ public class ProviderFactory implements ApplicationContextAware {
|
||||
DataSourceType dataSourceType = new DataSourceType(d.getType(), d.getName(), false, d.getExtraParams(), d.getCalculationMode(), d.isJdbc());
|
||||
if(dataSourceType.getType().equalsIgnoreCase("oracle")){
|
||||
dataSourceType.setCharset(d.getCharset());
|
||||
dataSourceType.setTargetCharset(d.getTargetCharset());
|
||||
}
|
||||
beanFactory.registerSingleton(d.getType(), dataSourceType);
|
||||
}
|
||||
|
||||
@ -216,10 +216,14 @@ public class JdbcProvider extends DefaultJdbcProvider {
|
||||
|
||||
private List<String[]> getDataResult(ResultSet rs, DatasourceRequest datasourceRequest) throws Exception {
|
||||
String charset = null;
|
||||
String targetCharset = "UTF-8";
|
||||
if (datasourceRequest != null && datasourceRequest.getDatasource().getType().equalsIgnoreCase("oracle")) {
|
||||
JdbcConfiguration JdbcConfiguration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), JdbcConfiguration.class);
|
||||
if (StringUtils.isNotEmpty(JdbcConfiguration.getCharset()) && !JdbcConfiguration.getCharset().equalsIgnoreCase("Default")) {
|
||||
charset = JdbcConfiguration.getCharset();
|
||||
JdbcConfiguration jdbcConfiguration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), JdbcConfiguration.class);
|
||||
if (StringUtils.isNotEmpty(jdbcConfiguration.getCharset()) && !jdbcConfiguration.getCharset().equalsIgnoreCase("Default")) {
|
||||
charset = jdbcConfiguration.getCharset();
|
||||
}
|
||||
if (StringUtils.isNotEmpty(jdbcConfiguration.getTargetCharset()) && !jdbcConfiguration.getTargetCharset().equalsIgnoreCase("Default")) {
|
||||
targetCharset = jdbcConfiguration.getTargetCharset();
|
||||
}
|
||||
}
|
||||
List<String[]> list = new LinkedList<>();
|
||||
@ -239,11 +243,17 @@ public class JdbcProvider extends DefaultJdbcProvider {
|
||||
row[j] = rs.getBoolean(j + 1) ? "1" : "0";
|
||||
break;
|
||||
default:
|
||||
if (charset != null && StringUtils.isNotEmpty(rs.getString(j + 1))) {
|
||||
row[j] = new String(rs.getString(j + 1).getBytes(charset), "UTF-8");
|
||||
if (metaData.getColumnTypeName(j + 1).toLowerCase().equalsIgnoreCase("blob")) {
|
||||
row[j] = rs.getBlob(j + 1) == null ? "" : rs.getBlob(j + 1).toString();
|
||||
} else {
|
||||
row[j] = rs.getString(j + 1);
|
||||
if (charset != null && StringUtils.isNotEmpty(rs.getString(j + 1))) {
|
||||
String orginStr = new String(rs.getString(j + 1).getBytes(charset), targetCharset);
|
||||
row[j] = new String(orginStr.getBytes("UTF-8"), "UTF-8");
|
||||
} else {
|
||||
row[j] = rs.getString(j + 1);
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -308,7 +318,7 @@ public class JdbcProvider extends DefaultJdbcProvider {
|
||||
String queryStr = getTablesSql(datasourceRequest);
|
||||
try (Connection con = getConnection(datasourceRequest); Statement statement = con.createStatement(); ResultSet resultSet = statement.executeQuery(queryStr)) {
|
||||
} catch (Exception e) {
|
||||
LogUtil.error("Datasource is invalid: " + datasourceRequest.getDatasource().getName() , e);
|
||||
LogUtil.error("Datasource is invalid: " + datasourceRequest.getDatasource().getName(), e);
|
||||
io.dataease.plugins.common.exception.DataEaseException.throwException(e.getMessage());
|
||||
}
|
||||
return "Success";
|
||||
@ -452,7 +462,7 @@ public class JdbcProvider extends DefaultJdbcProvider {
|
||||
driverClassName = defaultDriver;
|
||||
jdbcClassLoader = extendedJdbcClassLoader;
|
||||
} else {
|
||||
if(deDriver == null){
|
||||
if (deDriver == null) {
|
||||
deDriver = deDriverMapper.selectByPrimaryKey(customDriver);
|
||||
}
|
||||
driverClassName = deDriver.getDriverClass();
|
||||
|
||||
@ -1714,11 +1714,11 @@ public class DataSetTableService {
|
||||
}
|
||||
datasetTableField.setSize(filed.getFieldSize());
|
||||
datasetTableField.setChecked(true);
|
||||
datasetTableField.setColumnIndex(i);
|
||||
datasetTableField.setLastSyncTime(syncTime);
|
||||
datasetTableField.setExtField(0);
|
||||
datasetTableField.setGroupType((datasetTableField.getDeType() < 2 || datasetTableField.getDeType() == 6) ? "d" : "q");
|
||||
}
|
||||
datasetTableField.setColumnIndex(i);
|
||||
dataSetTableFieldsService.save(datasetTableField);
|
||||
}
|
||||
// delete 数据库中多余的字段
|
||||
|
||||
@ -12,6 +12,7 @@ import io.dataease.plugins.common.constants.DatasourceTypes;
|
||||
import io.dataease.plugins.common.constants.DeTypeConstants;
|
||||
import io.dataease.plugins.common.dto.datasource.TableField;
|
||||
import io.dataease.plugins.common.request.datasource.DatasourceRequest;
|
||||
import io.dataease.plugins.datasource.entity.JdbcConfiguration;
|
||||
import io.dataease.plugins.datasource.provider.Provider;
|
||||
import io.dataease.plugins.datasource.query.QueryProvider;
|
||||
import io.dataease.provider.DDLProvider;
|
||||
@ -918,24 +919,24 @@ public class ExtractDataService {
|
||||
}
|
||||
transMeta.addDatabase(dataMeta);
|
||||
selectSQL = getSelectSQL(extractType, datasetTable, datasource, datasetTableFields, selectSQL);
|
||||
inputStep = inputStep(transMeta, selectSQL);
|
||||
udjcStep = udjc(datasetTableFields, DatasourceTypes.mysql);
|
||||
inputStep = inputStep(transMeta, selectSQL, mysqlConfiguration);
|
||||
udjcStep = udjc(datasetTableFields, DatasourceTypes.mysql, mysqlConfiguration);
|
||||
break;
|
||||
case sqlServer:
|
||||
SqlServerConfiguration sqlServerConfiguration = new Gson().fromJson(datasource.getConfiguration(), SqlServerConfiguration.class);
|
||||
dataMeta = new DatabaseMeta("db", "MSSQLNATIVE", "Native", sqlServerConfiguration.getHost().trim(), sqlServerConfiguration.getDataBase(), sqlServerConfiguration.getPort().toString(), sqlServerConfiguration.getUsername(), sqlServerConfiguration.getPassword());
|
||||
transMeta.addDatabase(dataMeta);
|
||||
selectSQL = getSelectSQL(extractType, datasetTable, datasource, datasetTableFields, selectSQL);
|
||||
inputStep = inputStep(transMeta, selectSQL);
|
||||
udjcStep = udjc(datasetTableFields, DatasourceTypes.sqlServer);
|
||||
inputStep = inputStep(transMeta, selectSQL, sqlServerConfiguration);
|
||||
udjcStep = udjc(datasetTableFields, DatasourceTypes.sqlServer, sqlServerConfiguration);
|
||||
break;
|
||||
case pg:
|
||||
PgConfiguration pgConfiguration = new Gson().fromJson(datasource.getConfiguration(), PgConfiguration.class);
|
||||
dataMeta = new DatabaseMeta("db", "POSTGRESQL", "Native", pgConfiguration.getHost().trim(), pgConfiguration.getDataBase(), pgConfiguration.getPort().toString(), pgConfiguration.getUsername(), pgConfiguration.getPassword());
|
||||
transMeta.addDatabase(dataMeta);
|
||||
selectSQL = getSelectSQL(extractType, datasetTable, datasource, datasetTableFields, selectSQL);
|
||||
inputStep = inputStep(transMeta, selectSQL);
|
||||
udjcStep = udjc(datasetTableFields, DatasourceTypes.pg);
|
||||
inputStep = inputStep(transMeta, selectSQL, pgConfiguration);
|
||||
udjcStep = udjc(datasetTableFields, DatasourceTypes.pg, pgConfiguration);
|
||||
break;
|
||||
case oracle:
|
||||
OracleConfiguration oracleConfiguration = new Gson().fromJson(datasource.getConfiguration(), OracleConfiguration.class);
|
||||
@ -946,10 +947,9 @@ public class ExtractDataService {
|
||||
dataMeta = new DatabaseMeta("db", "ORACLE", "Native", oracleConfiguration.getHost().trim(), oracleConfiguration.getDataBase(), oracleConfiguration.getPort().toString(), oracleConfiguration.getUsername(), oracleConfiguration.getPassword());
|
||||
}
|
||||
transMeta.addDatabase(dataMeta);
|
||||
|
||||
selectSQL = getSelectSQL(extractType, datasetTable, datasource, datasetTableFields, selectSQL);
|
||||
inputStep = inputStep(transMeta, selectSQL);
|
||||
udjcStep = udjc(datasetTableFields, DatasourceTypes.oracle);
|
||||
inputStep = inputStep(transMeta, selectSQL, oracleConfiguration);
|
||||
udjcStep = udjc(datasetTableFields, DatasourceTypes.oracle, oracleConfiguration);
|
||||
break;
|
||||
case ck:
|
||||
CHConfiguration chConfiguration = new Gson().fromJson(datasource.getConfiguration(), CHConfiguration.class);
|
||||
@ -957,8 +957,8 @@ public class ExtractDataService {
|
||||
dataMeta.setDatabaseType("Clickhouse");
|
||||
transMeta.addDatabase(dataMeta);
|
||||
selectSQL = getSelectSQL(extractType, datasetTable, datasource, datasetTableFields, selectSQL);
|
||||
inputStep = inputStep(transMeta, selectSQL);
|
||||
udjcStep = udjc(datasetTableFields, DatasourceTypes.ck);
|
||||
inputStep = inputStep(transMeta, selectSQL, chConfiguration);
|
||||
udjcStep = udjc(datasetTableFields, DatasourceTypes.ck, chConfiguration);
|
||||
break;
|
||||
case db2:
|
||||
Db2Configuration db2Configuration = new Gson().fromJson(datasource.getConfiguration(), Db2Configuration.class);
|
||||
@ -966,12 +966,12 @@ public class ExtractDataService {
|
||||
dataMeta.setDatabaseType("DB2");
|
||||
transMeta.addDatabase(dataMeta);
|
||||
selectSQL = getSelectSQL(extractType, datasetTable, datasource, datasetTableFields, selectSQL);
|
||||
inputStep = inputStep(transMeta, selectSQL);
|
||||
udjcStep = udjc(datasetTableFields, DatasourceTypes.db2);
|
||||
inputStep = inputStep(transMeta, selectSQL, db2Configuration);
|
||||
udjcStep = udjc(datasetTableFields, DatasourceTypes.db2, db2Configuration);
|
||||
break;
|
||||
case excel:
|
||||
inputStep = excelInputStep(datasetTable.getInfo(), datasetTableFields);
|
||||
udjcStep = udjc(datasetTableFields, DatasourceTypes.excel);
|
||||
udjcStep = udjc(datasetTableFields, DatasourceTypes.excel, null);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@ -1030,7 +1030,7 @@ public class ExtractDataService {
|
||||
return selectSQL;
|
||||
}
|
||||
|
||||
private StepMeta inputStep(TransMeta transMeta, String selectSQL) {
|
||||
private StepMeta inputStep(TransMeta transMeta, String selectSQL, JdbcConfiguration jdbcConfiguration) {
|
||||
TableInputMeta tableInput = new TableInputMeta();
|
||||
DatabaseMeta database = transMeta.findDatabase("db");
|
||||
tableInput.setDatabaseMeta(database);
|
||||
@ -1164,7 +1164,7 @@ public class ExtractDataService {
|
||||
return outputStep;
|
||||
}
|
||||
|
||||
private StepMeta udjc(List<DatasetTableField> datasetTableFields, DatasourceTypes datasourceType) {
|
||||
private StepMeta udjc(List<DatasetTableField> datasetTableFields, DatasourceTypes datasourceType, JdbcConfiguration jdbcConfiguration) {
|
||||
StringBuilder handleBinaryTypeCode = new StringBuilder();
|
||||
String excelCompletion = "";
|
||||
|
||||
@ -1183,10 +1183,25 @@ public class ExtractDataService {
|
||||
String tmp_code = code.replace("handleWraps", handleWraps).replace("handleBinaryType", handleBinaryTypeCode.toString());
|
||||
|
||||
String Column_Fields;
|
||||
|
||||
if (datasourceType.equals(DatasourceTypes.oracle) || datasourceType.equals(DatasourceTypes.db2)) {
|
||||
Column_Fields = datasetTableFields.stream().map(DatasetTableField::getOriginName).collect(Collectors.joining(","));
|
||||
String charset = null;
|
||||
String targetCharset = "UTF-8";
|
||||
if (StringUtils.isNotEmpty(jdbcConfiguration.getCharset()) && !jdbcConfiguration.getCharset().equalsIgnoreCase("Default")) {
|
||||
charset = jdbcConfiguration.getCharset();
|
||||
}
|
||||
if (StringUtils.isNotEmpty(jdbcConfiguration.getTargetCharset()) && !jdbcConfiguration.getTargetCharset().equalsIgnoreCase("Default")) {
|
||||
targetCharset = jdbcConfiguration.getTargetCharset();
|
||||
}
|
||||
if (StringUtils.isNotEmpty(charset)) {
|
||||
tmp_code = tmp_code.replace("handleCharset", handleCharset.replace("Datasource_Charset", charset).replace("Target_Charset", targetCharset));
|
||||
}else {
|
||||
tmp_code = tmp_code.replace("handleCharset", "");
|
||||
}
|
||||
} else {
|
||||
Column_Fields = datasetTableFields.stream().map(DatasetTableField::getDataeaseName).collect(Collectors.joining(","));
|
||||
tmp_code = tmp_code.replace("handleCharset", "");
|
||||
}
|
||||
|
||||
if (datasourceType.equals(DatasourceTypes.excel)) {
|
||||
@ -1297,6 +1312,12 @@ public class ExtractDataService {
|
||||
" get(Fields.Out, filed).setValue(r, tmp);\n" +
|
||||
" } \n";
|
||||
|
||||
private final static String handleCharset = "\tif(tmp != null){\n" +
|
||||
" \t\t\ttry {\n" +
|
||||
"\t\t\t\tget(Fields.Out, filed).setValue(r, new String(tmp.getBytes(\"Datasource_Charset\"), \"Target_Charset\"));\n" +
|
||||
" \t\t}catch (Exception e){}\n" +
|
||||
"\t\t}";
|
||||
|
||||
private final static String code = "import org.pentaho.di.core.row.ValueMetaInterface;\n" +
|
||||
"import java.util.List;\n" +
|
||||
"import java.io.File;\n" +
|
||||
@ -1326,6 +1347,7 @@ public class ExtractDataService {
|
||||
" List<String> fileds = Arrays.asList(\"Column_Fields\".split(\",\"));\n" +
|
||||
" for (String filed : fileds) {\n" +
|
||||
" String tmp = get(Fields.In, filed).getString(r);\n" +
|
||||
"handleCharset \n" +
|
||||
"handleWraps \n" +
|
||||
"ExcelCompletion \n" +
|
||||
"handleBinaryType \n" +
|
||||
|
||||
@ -105,6 +105,9 @@ public class DriverService {
|
||||
public void deleteDriverFile(String driverFileId) throws Exception{
|
||||
DeDriverDetails deDriverDetails = deDriverDetailsMapper.selectByPrimaryKey(driverFileId);
|
||||
DeDriver deDriver = deDriverMapper.selectByPrimaryKey(deDriverDetails.getDeDriverId());
|
||||
if(deDriver == null){
|
||||
throw new Exception(Translator.get("I18N_DRIVER_NOT_FOUND"));
|
||||
}
|
||||
DeFileUtils.deleteFile(DRIVER_PATH + deDriverDetails.getDeDriverId() + "/" + deDriverDetails.getFileName());
|
||||
SysLogDTO sysLogDTO = DeLogUtils.buildLog(SysLogConstants.OPERATE_TYPE.DELETE, SysLogConstants.SOURCE_TYPE.DRIVER_FILE, deDriverDetails.getId(), deDriverDetails.getDeDriverId(), null, null);
|
||||
DeLogUtils.save(sysLogDTO);
|
||||
@ -114,6 +117,10 @@ public class DriverService {
|
||||
}
|
||||
|
||||
public DeDriverDetails saveJar(MultipartFile file, String driverId) throws Exception {
|
||||
DeDriver deDriver = deDriverMapper.selectByPrimaryKey(driverId);
|
||||
if(deDriver == null){
|
||||
throw new Exception(Translator.get("I18N_DRIVER_NOT_FOUND"));
|
||||
}
|
||||
String filename = file.getOriginalFilename();
|
||||
String dirPath = DRIVER_PATH + driverId + "/";
|
||||
String filePath = dirPath + filename;
|
||||
@ -138,7 +145,6 @@ public class DriverService {
|
||||
deDriverDetailsMapper.insert(deDriverDetails);
|
||||
SysLogDTO sysLogDTO = DeLogUtils.buildLog(SysLogConstants.OPERATE_TYPE.UPLOADFILE, SysLogConstants.SOURCE_TYPE.DRIVER_FILE, deDriverDetails.getId(), driverId, null, null);
|
||||
DeLogUtils.save(sysLogDTO);
|
||||
DeDriver deDriver = deDriverMapper.selectByPrimaryKey(driverId);
|
||||
DefaultJdbcProvider defaultJdbcProvider = (DefaultJdbcProvider)ProviderFactory.getProvider(deDriver.getType());
|
||||
defaultJdbcProvider.reloadCustomJdbcClassLoader(deDriver);
|
||||
return deDriverDetails;
|
||||
|
||||
@ -12,6 +12,7 @@ import io.dataease.plugins.common.base.domain.PanelTemplate;
|
||||
import io.dataease.plugins.common.base.domain.PanelTemplateExample;
|
||||
import io.dataease.plugins.common.base.domain.PanelTemplateWithBLOBs;
|
||||
import io.dataease.plugins.common.base.mapper.PanelTemplateMapper;
|
||||
import io.dataease.service.staticResource.StaticResourceService;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
@ -35,6 +36,8 @@ public class PanelTemplateService {
|
||||
private PanelTemplateMapper panelTemplateMapper;
|
||||
@Resource
|
||||
private ExtPanelTemplateMapper extPanelTemplateMapper;
|
||||
@Resource
|
||||
private StaticResourceService staticResourceService;
|
||||
|
||||
public List<PanelTemplateDTO> templateList(PanelTemplateRequest panelTemplateRequest) {
|
||||
panelTemplateRequest.setWithBlobs("N");
|
||||
@ -75,6 +78,8 @@ public class PanelTemplateService {
|
||||
exampleDelete.createCriteria().andPidEqualTo(request.getPid()).andNameEqualTo(request.getName());
|
||||
panelTemplateMapper.deleteByExample(exampleDelete);
|
||||
}
|
||||
//Store static resource into the server
|
||||
staticResourceService.saveFilesToServe(request.getStaticResource());
|
||||
panelTemplateMapper.insert(request);
|
||||
} else {
|
||||
String nameCheckResult = this.nameCheck(CommonConstants.OPT_TYPE.UPDATE, request.getName(), request.getPid(), request.getId());
|
||||
|
||||
2
backend/src/main/resources/db/migration/V36__1.11.2.sql
Normal file
2
backend/src/main/resources/db/migration/V36__1.11.2.sql
Normal file
@ -0,0 +1,2 @@
|
||||
INSERT INTO `sys_menu` (`menu_id`, `pid`, `sub_count`, `type`, `title`, `name`, `component`, `menu_sort`, `icon`, `path`, `i_frame`, `cache`, `hidden`, `permission`, `create_by`, `update_by`, `create_time`, `update_time`) VALUES (102, 101, 0, 2, '上传插件', NULL, NULL, 999, NULL, NULL, b'0', b'0', b'0', 'plugin:upload', NULL, NULL, 1614930862373, 1614930862373);
|
||||
INSERT INTO `sys_menu` (`menu_id`, `pid`, `sub_count`, `type`, `title`, `name`, `component`, `menu_sort`, `icon`, `path`, `i_frame`, `cache`, `hidden`, `permission`, `create_by`, `update_by`, `create_time`, `update_time`) VALUES (103, 101, 0, 2, '卸载插件', NULL, NULL, 999, NULL, NULL, b'0', b'0', b'0', 'plugin:uninstall', NULL, NULL, 1614930862373, 1614930862373);
|
||||
@ -155,4 +155,5 @@ SOURCE_TYPE_DRIVER_FILE=DRIVER FILE
|
||||
SOURCE_TYPE_MENU=MENU
|
||||
|
||||
I18N_DRIVER_NOT_DELETE=Drivers in use cannot be deleted
|
||||
I18N_DRIVER_REPEAT_NAME=Driver name cannot be same.
|
||||
I18N_DRIVER_REPEAT_NAME=Driver name cannot be same.
|
||||
I18N_DRIVER_NOT_FOUND=Cannot find driver.
|
||||
@ -159,3 +159,4 @@ I18N_TIME=操作时间
|
||||
|
||||
I18N_DRIVER_NOT_DELETE=使用中的驱动不允许删除
|
||||
I18N_DRIVER_REPEAT_NAME=名称重复
|
||||
I18N_DRIVER_NOT_FOUND=未找到驱动
|
||||
|
||||
@ -154,4 +154,5 @@ SOURCE_TYPE_DRIVER_FILE=驅動文件
|
||||
SOURCE_TYPE_MENU=菜單
|
||||
|
||||
I18N_DRIVER_NOT_DELETE=使用中的驅動不允許删除
|
||||
I18N_DRIVER_REPEAT_NAME=名稱重複
|
||||
I18N_DRIVER_REPEAT_NAME=名稱重複
|
||||
I18N_DRIVER_NOT_FOUND=未找到驅動
|
||||
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "dataease",
|
||||
"version": "1.11.1",
|
||||
"version": "1.11.3",
|
||||
"description": "dataease front",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
<parent>
|
||||
<artifactId>dataease-server</artifactId>
|
||||
<groupId>io.dataease</groupId>
|
||||
<version>1.11.1</version>
|
||||
<version>1.11.3</version>
|
||||
</parent>
|
||||
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
@ -84,6 +84,8 @@ import UserViewMobileDialog from '@/components/canvas/custom-component/UserViewM
|
||||
import bus from '@/utils/bus'
|
||||
import { buildFilterMap } from '@/utils/conditionUtil'
|
||||
import { hasDataPermission } from '@/utils/permission'
|
||||
const erd = elementResizeDetectorMaker()
|
||||
|
||||
export default {
|
||||
components: { UserViewMobileDialog, ComponentWrapper, UserViewDialog, CanvasOptBar },
|
||||
model: {
|
||||
@ -273,37 +275,17 @@ export default {
|
||||
},
|
||||
mounted() {
|
||||
this._isMobile()
|
||||
const _this = this
|
||||
const erd = elementResizeDetectorMaker()
|
||||
const canvasMain = document.getElementById('canvasInfoMain')
|
||||
// 监听主div变动事件
|
||||
if (canvasMain) {
|
||||
erd.listenTo(canvasMain, element => {
|
||||
_this.$nextTick(() => {
|
||||
_this.restore()
|
||||
})
|
||||
})
|
||||
}
|
||||
// 监听画布div变动事件
|
||||
const tempCanvas = document.getElementById('canvasInfoTemp')
|
||||
if (tempCanvas) {
|
||||
erd.listenTo(document.getElementById('canvasInfoTemp'), element => {
|
||||
_this.$nextTick(() => {
|
||||
// 将mainHeight 修改为px 临时解决html2canvas 截图不全的问题
|
||||
_this.mainHeight = tempCanvas.scrollHeight + 'px!important'
|
||||
this.$emit('mainHeightChange', _this.mainHeight)
|
||||
})
|
||||
})
|
||||
}
|
||||
eventBus.$on('openChartDetailsDialog', this.openChartDetailsDialog)
|
||||
_this.$store.commit('clearLinkageSettingInfo', false)
|
||||
_this.canvasStyleDataInit()
|
||||
this.initListen()
|
||||
this.$store.commit('clearLinkageSettingInfo', false)
|
||||
this.canvasStyleDataInit()
|
||||
// 如果当前终端设备是移动端,则进行移动端的布局设计
|
||||
if (_this.terminal === 'mobile') {
|
||||
_this.initMobileCanvas()
|
||||
if (this.terminal === 'mobile') {
|
||||
this.initMobileCanvas()
|
||||
}
|
||||
},
|
||||
beforeDestroy() {
|
||||
erd.uninstall(this.$refs.canvasInfoTemp)
|
||||
erd.uninstall(this.$refs.canvasInfoMain)
|
||||
clearInterval(this.timer)
|
||||
},
|
||||
methods: {
|
||||
@ -403,6 +385,33 @@ export default {
|
||||
},
|
||||
canvasScroll() {
|
||||
bus.$emit('onScroll')
|
||||
},
|
||||
initListen() {
|
||||
const _this = this
|
||||
const canvasMain = document.getElementById('canvasInfoMain')
|
||||
// 监听主div变动事件
|
||||
if (canvasMain) {
|
||||
erd.listenTo(canvasMain, element => {
|
||||
_this.$nextTick(() => {
|
||||
_this.restore()
|
||||
})
|
||||
})
|
||||
}
|
||||
setTimeout(() => {
|
||||
// 监听画布div变动事件
|
||||
const tempCanvas = document.getElementById('canvasInfoTemp')
|
||||
if (tempCanvas) {
|
||||
erd.listenTo(document.getElementById('canvasInfoTemp'), element => {
|
||||
_this.$nextTick(() => {
|
||||
// 将mainHeight 修改为px 临时解决html2canvas 截图不全的问题
|
||||
_this.mainHeight = tempCanvas.scrollHeight + 'px!important'
|
||||
this.$emit('mainHeightChange', _this.mainHeight)
|
||||
})
|
||||
})
|
||||
}
|
||||
}, 1500)
|
||||
|
||||
eventBus.$on('openChartDetailsDialog', this.openChartDetailsDialog)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -524,7 +524,7 @@ export default {
|
||||
}
|
||||
}
|
||||
},
|
||||
getData(id, cache = true) {
|
||||
getData(id, cache = true, dataBroadcast = false) {
|
||||
if (id) {
|
||||
this.requestStatus = 'waiting'
|
||||
this.message = null
|
||||
@ -549,7 +549,7 @@ export default {
|
||||
// 将视图传入echart组件
|
||||
if (response.success) {
|
||||
this.chart = response.data
|
||||
this.getDataOnly(response.data)
|
||||
this.getDataOnly(response.data, dataBroadcast)
|
||||
this.chart['position'] = this.inTab ? 'tab' : 'panel'
|
||||
// 记录当前数据
|
||||
this.panelViewDetailsInfo[id] = JSON.stringify(this.chart)
|
||||
@ -845,7 +845,7 @@ export default {
|
||||
getDataEdit(param) {
|
||||
this.$store.state.styleChangeTimes++
|
||||
if (param.type === 'propChange') {
|
||||
this.getData(param.viewId, false)
|
||||
this.getData(param.viewId, false, true)
|
||||
} else if (param.type === 'styleChange') {
|
||||
this.chart.customAttr = param.viewInfo.customAttr
|
||||
this.chart.customStyle = param.viewInfo.customStyle
|
||||
@ -860,7 +860,7 @@ export default {
|
||||
this.mergeScale()
|
||||
}
|
||||
},
|
||||
getDataOnly(sourceResponseData) {
|
||||
getDataOnly(sourceResponseData, dataBroadcast) {
|
||||
if (this.isEdit) {
|
||||
if ((this.filter.filter && this.filter.filter.length) || (this.filter.linkageFilters && this.filter.linkageFilters.length)) {
|
||||
viewData(this.chart.id, this.panelInfo.id, {
|
||||
@ -869,9 +869,15 @@ export default {
|
||||
queryFrom: 'panel'
|
||||
}).then(response => {
|
||||
this.componentViewsData[this.chart.id] = response.data
|
||||
if (dataBroadcast) {
|
||||
bus.$emit('prop-change-data')
|
||||
}
|
||||
})
|
||||
} else {
|
||||
this.componentViewsData[this.chart.id] = sourceResponseData
|
||||
if (dataBroadcast) {
|
||||
bus.$emit('prop-change-data')
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1383,7 +1383,9 @@ export default {
|
||||
schema: 'Database Schema',
|
||||
please_choose_schema: 'Please select Schema',
|
||||
charset: 'Charset',
|
||||
please_choose_charset: 'Please select Charset',
|
||||
targetCharset: 'Target Charset',
|
||||
please_choose_targetCharset: 'Please select target charset',
|
||||
please_choose_charset: 'Please select charset',
|
||||
edit_datasource_msg: 'Modifying the data source information may make the data set under the modified data source unavailable. Confirm the modification?',
|
||||
repeat_datasource_msg: 'Data source information with the same configuration already exists, ',
|
||||
confirm_save: 'Confirm save?',
|
||||
|
||||
@ -1384,6 +1384,8 @@ export default {
|
||||
schema: '數據庫 Schema',
|
||||
please_choose_schema: '請選擇數據庫 Schema',
|
||||
charset: '字符集',
|
||||
targetCharset: '目標字符集',
|
||||
please_choose_targetCharset: '請選擇目標字符集',
|
||||
please_choose_charset: '請選擇數據庫字符集',
|
||||
edit_datasource_msg: '修改數據源信息,可能會導致改數據源下的數據集不可用,確認修改?',
|
||||
repeat_datasource_msg: '已經存在相同配置的數據源信息,',
|
||||
|
||||
@ -1389,8 +1389,10 @@ export default {
|
||||
get_schema: '获取 Schema',
|
||||
schema: '数据库 Schema',
|
||||
charset: '字符集',
|
||||
targetCharset: '目标字符集',
|
||||
please_choose_schema: '请选择数据库 Schema',
|
||||
please_choose_charset: '请选择数据库字符集',
|
||||
please_choose_targetCharset: '请选择目标字符集',
|
||||
edit_datasource_msg: '修改数据源信息,可能会导致该数据源下的数据集不可用,确认修改?',
|
||||
repeat_datasource_msg: '已经存在相同配置的数据源信息, ',
|
||||
confirm_save: '确认保存?',
|
||||
|
||||
@ -367,7 +367,8 @@ export const TYPE_CONFIGS = [
|
||||
'icon',
|
||||
'orient',
|
||||
'textStyle',
|
||||
'hPosition'
|
||||
'hPosition',
|
||||
'vPosition'
|
||||
]
|
||||
}
|
||||
},
|
||||
@ -442,7 +443,8 @@ export const TYPE_CONFIGS = [
|
||||
'icon',
|
||||
'orient',
|
||||
'textStyle',
|
||||
'hPosition'
|
||||
'hPosition',
|
||||
'vPosition'
|
||||
]
|
||||
}
|
||||
},
|
||||
@ -517,7 +519,8 @@ export const TYPE_CONFIGS = [
|
||||
'icon',
|
||||
'orient',
|
||||
'textStyle',
|
||||
'hPosition'
|
||||
'hPosition',
|
||||
'vPosition'
|
||||
]
|
||||
}
|
||||
},
|
||||
@ -591,7 +594,8 @@ export const TYPE_CONFIGS = [
|
||||
'icon',
|
||||
'orient',
|
||||
'textStyle',
|
||||
'hPosition'
|
||||
'hPosition',
|
||||
'vPosition'
|
||||
]
|
||||
}
|
||||
},
|
||||
@ -725,7 +729,8 @@ export const TYPE_CONFIGS = [
|
||||
'icon',
|
||||
'orient',
|
||||
'textStyle',
|
||||
'hPosition'
|
||||
'hPosition',
|
||||
'vPosition'
|
||||
]
|
||||
}
|
||||
},
|
||||
@ -799,7 +804,8 @@ export const TYPE_CONFIGS = [
|
||||
'icon',
|
||||
'orient',
|
||||
'textStyle',
|
||||
'hPosition'
|
||||
'hPosition',
|
||||
'vPosition'
|
||||
]
|
||||
}
|
||||
},
|
||||
@ -852,7 +858,8 @@ export const TYPE_CONFIGS = [
|
||||
'icon',
|
||||
'orient',
|
||||
'textStyle',
|
||||
'hPosition'
|
||||
'hPosition',
|
||||
'vPosition'
|
||||
]
|
||||
}
|
||||
},
|
||||
@ -905,7 +912,8 @@ export const TYPE_CONFIGS = [
|
||||
'icon',
|
||||
'orient',
|
||||
'textStyle',
|
||||
'hPosition'
|
||||
'hPosition',
|
||||
'vPosition'
|
||||
]
|
||||
}
|
||||
},
|
||||
@ -959,7 +967,8 @@ export const TYPE_CONFIGS = [
|
||||
'icon',
|
||||
'orient',
|
||||
'textStyle',
|
||||
'hPosition'
|
||||
'hPosition',
|
||||
'vPosition'
|
||||
],
|
||||
'split-selector-ant-v': [
|
||||
'splitForm',
|
||||
@ -1010,7 +1019,8 @@ export const TYPE_CONFIGS = [
|
||||
'icon',
|
||||
'orient',
|
||||
'textStyle',
|
||||
'hPosition'
|
||||
'hPosition',
|
||||
'vPosition'
|
||||
]
|
||||
}
|
||||
},
|
||||
@ -1115,7 +1125,8 @@ export const TYPE_CONFIGS = [
|
||||
'icon',
|
||||
'orient',
|
||||
'textStyle',
|
||||
'hPosition'
|
||||
'hPosition',
|
||||
'vPosition'
|
||||
]
|
||||
}
|
||||
},
|
||||
@ -1163,7 +1174,8 @@ export const TYPE_CONFIGS = [
|
||||
'icon',
|
||||
'orient',
|
||||
'textStyle',
|
||||
'hPosition'
|
||||
'hPosition',
|
||||
'vPosition'
|
||||
]
|
||||
}
|
||||
},
|
||||
@ -1191,7 +1203,7 @@ export const TYPE_CONFIGS = [
|
||||
'tableItemFontSize',
|
||||
'tableTitleHeight',
|
||||
'tableItemHeight',
|
||||
'tableColumnMode'
|
||||
'tableColumnWidth'
|
||||
],
|
||||
'title-selector': [
|
||||
'show',
|
||||
@ -1229,7 +1241,7 @@ export const TYPE_CONFIGS = [
|
||||
'tableItemFontSize',
|
||||
'tableTitleHeight',
|
||||
'tableItemHeight',
|
||||
'tableColumnMode'
|
||||
'tableColumnWidth'
|
||||
],
|
||||
'title-selector': [
|
||||
'show',
|
||||
@ -1538,16 +1550,7 @@ export const TYPE_CONFIGS = [
|
||||
'alpha'
|
||||
],
|
||||
'size-selector': [
|
||||
'barDefault',
|
||||
'barWidth',
|
||||
'barGap',
|
||||
'lineWidth',
|
||||
'lineType',
|
||||
'lineSymbol',
|
||||
'lineSymbolSize',
|
||||
'lineArea',
|
||||
'bubble_scatterSymbol',
|
||||
'bubble_scatterSymbolSize'
|
||||
'mix'
|
||||
],
|
||||
'label-selector': [
|
||||
'show',
|
||||
@ -2300,7 +2303,6 @@ export const TYPE_CONFIGS = [
|
||||
icon: 'map',
|
||||
properties: [
|
||||
'color-selector',
|
||||
'size-selector',
|
||||
'label-selector',
|
||||
'tooltip-selector',
|
||||
'title-selector'
|
||||
@ -2310,9 +2312,6 @@ export const TYPE_CONFIGS = [
|
||||
'value',
|
||||
'custom',
|
||||
'alpha'
|
||||
],
|
||||
'size-selector': [
|
||||
|
||||
],
|
||||
'label-selector': [
|
||||
'show',
|
||||
|
||||
@ -2,11 +2,11 @@
|
||||
<div style="width: 100%">
|
||||
<el-col>
|
||||
<el-form ref="titleForm" :model="titleForm" label-width="80px" size="mini">
|
||||
<el-form-item v-show="showProperty('show')" :label="$t('chart.show')" class="form-item">
|
||||
<el-form-item v-show="showProperty('show')" :label="$t('chart.show')" class="form-item">
|
||||
<el-checkbox v-model="titleForm.show" @change="changeTitleStyle('show')">{{ $t('chart.show') }}</el-checkbox>
|
||||
</el-form-item>
|
||||
<div v-show="showProperty('show') && titleForm.show">
|
||||
<el-form-item v-show="showProperty('title')" v-if="!batchOptStatus" :label="$t('chart.title')" class="form-item">
|
||||
<el-form-item v-show="showProperty('title')" v-if="!batchOptStatus" :label="$t('chart.title')" class="form-item">
|
||||
<el-input
|
||||
v-model="titleForm.title"
|
||||
size="mini"
|
||||
@ -16,22 +16,22 @@
|
||||
@input="inputOnInput($event)"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item v-show="showProperty('fontSize')" :label="$t('chart.text_fontsize')" class="form-item">
|
||||
<el-form-item v-show="showProperty('fontSize')" :label="$t('chart.text_fontsize')" class="form-item">
|
||||
<el-select v-model="titleForm.fontSize" :placeholder="$t('chart.text_fontsize')" size="mini" @change="changeTitleStyle('fontSize')">
|
||||
<el-option v-for="option in fontSize" :key="option.value" :label="option.name" :value="option.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item v-show="showProperty('color')" :label="$t('chart.text_color')" class="form-item">
|
||||
<el-form-item v-show="showProperty('color')" :label="$t('chart.text_color')" class="form-item">
|
||||
<el-color-picker v-model="titleForm.color" class="color-picker-style" :predefine="predefineColors" @change="changeTitleStyle('color')" />
|
||||
</el-form-item>
|
||||
<el-form-item v-show="showProperty('hPosition')" :label="$t('chart.text_h_position')" class="form-item">
|
||||
<el-form-item v-show="showProperty('hPosition')" :label="$t('chart.text_h_position')" class="form-item">
|
||||
<el-radio-group v-model="titleForm.hPosition" size="mini" @change="changeTitleStyle('hPosition')">
|
||||
<el-radio-button label="left">{{ $t('chart.text_pos_left') }}</el-radio-button>
|
||||
<el-radio-button label="center">{{ $t('chart.text_pos_center') }}</el-radio-button>
|
||||
<el-radio-button label="right">{{ $t('chart.text_pos_right') }}</el-radio-button>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item v-show="showProperty('isItalic') || showProperty('isBolder') " :label="$t('chart.text_style')" class="form-item">
|
||||
<el-form-item v-show="showProperty('isItalic') || showProperty('isBolder') " :label="$t('chart.text_style')" class="form-item">
|
||||
<el-checkbox v-model="titleForm.isItalic" @change="changeTitleStyle('isItalic')">{{ $t('chart.italic') }}</el-checkbox>
|
||||
<el-checkbox v-model="titleForm.isBolder" @change="changeTitleStyle('isBolder')">{{ $t('chart.bolder') }}</el-checkbox>
|
||||
</el-form-item>
|
||||
|
||||
@ -86,6 +86,7 @@ export default {
|
||||
} else {
|
||||
this.assistLine = []
|
||||
}
|
||||
this.lineArr = JSON.parse(JSON.stringify(this.assistLine))
|
||||
}
|
||||
},
|
||||
changeAssistLine() {
|
||||
|
||||
@ -118,6 +118,7 @@
|
||||
import { COLOR_PANEL, DEFAULT_COLOR_CASE } from '../../chart/chart'
|
||||
import { getColors } from '@/views/chart/chart/util'
|
||||
import { mapState } from 'vuex'
|
||||
import bus from '@/utils/bus'
|
||||
|
||||
export default {
|
||||
name: 'ColorSelector',
|
||||
@ -248,11 +249,15 @@ export default {
|
||||
},
|
||||
computed: {
|
||||
...mapState([
|
||||
'batchOptStatus'
|
||||
'batchOptStatus',
|
||||
'componentViewsData'
|
||||
])
|
||||
},
|
||||
mounted() {
|
||||
this.init()
|
||||
bus.$on('prop-change-data', () => {
|
||||
this.initCustomColor()
|
||||
})
|
||||
},
|
||||
methods: {
|
||||
changeColorOption(modifyName = 'value') {
|
||||
@ -336,8 +341,10 @@ export default {
|
||||
this.chart.type === 'funnel' ||
|
||||
this.chart.type === 'radar' ||
|
||||
this.chart.type === 'scatter')) {
|
||||
const chart = JSON.parse(JSON.stringify(this.chart))
|
||||
this.colorForm.seriesColors = getColors(chart, this.colorForm.colors, reset)
|
||||
if (this.componentViewsData[this.chart.id]) {
|
||||
const chart = JSON.parse(JSON.stringify(this.componentViewsData[this.chart.id]))
|
||||
this.colorForm.seriesColors = getColors(chart, this.colorForm.colors, reset)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -171,55 +171,56 @@
|
||||
<el-slider v-model="sizeForm.treemapHeight" show-input :show-input-controls="false" input-size="mini" :min="0" :max="100" @change="changeBarSizeCase('treemapHeight')" />
|
||||
</el-form-item>
|
||||
<!--treemap-end-->
|
||||
<!--chart-mix-end-->
|
||||
|
||||
<el-divider v-if="showProperty('barDefault')" content-position="center" class="divider-style">{{ $t('chart.chart_bar') }}</el-divider>
|
||||
<el-form-item v-show="showProperty('barDefault')" :label="$t('chart.adapt')" class="form-item">
|
||||
<el-checkbox v-model="sizeForm.barDefault" @change="changeBarSizeCase('barDefault')">{{ $t('chart.adapt') }}</el-checkbox>
|
||||
</el-form-item>
|
||||
<el-form-item v-show="showProperty('barWidth')" :label="$t('chart.bar_width')" class="form-item form-item-slider">
|
||||
<el-slider v-model="sizeForm.barWidth" :disabled="sizeForm.barDefault" show-input :show-input-controls="false" input-size="mini" :min="1" :max="80" @change="changeBarSizeCase('barWidth')" />
|
||||
</el-form-item>
|
||||
<el-form-item v-show="showProperty('barGap')" :label="$t('chart.bar_gap')" class="form-item form-item-slider">
|
||||
<el-slider v-model="sizeForm.barGap" :disabled="sizeForm.barDefault" show-input :show-input-controls="false" input-size="mini" :min="0" :max="5" :step="0.1" @change="changeBarSizeCase('barGap')" />
|
||||
</el-form-item>
|
||||
<el-divider v-if="showProperty('lineWidth')" content-position="center" class="divider-style">{{ $t('chart.chart_line') }}</el-divider>
|
||||
<el-form-item v-show="showProperty('lineWidth')" :label="$t('chart.line_width')" class="form-item form-item-slider">
|
||||
<el-slider v-model="sizeForm.lineWidth" show-input :show-input-controls="false" input-size="mini" :min="0" :max="10" @change="changeBarSizeCase('lineWidth')" />
|
||||
</el-form-item>
|
||||
<el-form-item v-show="showProperty('lineType')" :label="$t('chart.line_type')" class="form-item">
|
||||
<el-radio-group v-model="sizeForm.lineType" @change="changeBarSizeCase('lineType')">
|
||||
<el-radio-button label="solid">{{ $t('chart.line_type_solid') }}</el-radio-button>
|
||||
<el-radio-button label="dashed">{{ $t('chart.line_type_dashed') }}</el-radio-button>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item v-show="showProperty('lineSymbol')" :label="$t('chart.line_symbol')" class="form-item">
|
||||
<el-select v-model="sizeForm.lineSymbol" :placeholder="$t('chart.line_symbol')" @change="changeBarSizeCase('lineSymbol')">
|
||||
<el-option
|
||||
v-for="item in lineSymbolOptions"
|
||||
:key="item.value"
|
||||
:label="item.name"
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item v-show="showProperty('lineArea')" :label="$t('chart.line_area')" class="form-item">
|
||||
<el-checkbox v-model="sizeForm.lineArea" @change="changeBarSizeCase('lineArea')">{{ $t('chart.show') }}</el-checkbox>
|
||||
</el-form-item>
|
||||
<el-divider v-if="showProperty('bubble_scatterSymbol')" content-position="center" class="divider-style">{{ $t('chart.chart_scatter') }}</el-divider>
|
||||
<el-form-item v-show="showProperty('bubble_scatterSymbol')" :label="$t('chart.bubble_symbol')" class="form-item">
|
||||
<el-select v-model="sizeForm.scatterSymbol" :placeholder="$t('chart.line_symbol')" @change="changeBarSizeCase('scatterSymbol')">
|
||||
<el-option
|
||||
v-for="item in lineSymbolOptions"
|
||||
:key="item.value"
|
||||
:label="item.name"
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item v-show="showProperty('bubble_scatterSymbolSize')" :label="$t('chart.bubble_size')" class="form-item form-item-slider">
|
||||
<el-slider v-model="sizeForm.scatterSymbolSize" show-input :show-input-controls="false" input-size="mini" :min="1" :max="40" @change="changeBarSizeCase('scatterSymbolSize')" />
|
||||
</el-form-item>
|
||||
<!--chart-mix-start-->
|
||||
<span v-show="showProperty('mix')">
|
||||
<el-divider content-position="center" class="divider-style">{{ $t('chart.chart_bar') }}</el-divider>
|
||||
<el-form-item :label="$t('chart.adapt')" class="form-item">
|
||||
<el-checkbox v-model="sizeForm.barDefault" @change="changeBarSizeCase('barDefault')">{{ $t('chart.adapt') }}</el-checkbox>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('chart.bar_width')" class="form-item form-item-slider">
|
||||
<el-slider v-model="sizeForm.barWidth" :disabled="sizeForm.barDefault" show-input :show-input-controls="false" input-size="mini" :min="1" :max="80" @change="changeBarSizeCase('barWidth')" />
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('chart.bar_gap')" class="form-item form-item-slider">
|
||||
<el-slider v-model="sizeForm.barGap" :disabled="sizeForm.barDefault" show-input :show-input-controls="false" input-size="mini" :min="0" :max="5" :step="0.1" @change="changeBarSizeCase('barGap')" />
|
||||
</el-form-item>
|
||||
<el-divider content-position="center" class="divider-style">{{ $t('chart.chart_line') }}</el-divider>
|
||||
<el-form-item :label="$t('chart.line_width')" class="form-item form-item-slider">
|
||||
<el-slider v-model="sizeForm.lineWidth" show-input :show-input-controls="false" input-size="mini" :min="0" :max="10" @change="changeBarSizeCase('lineWidth')" />
|
||||
</el-form-item>
|
||||
<el-form-item v-show="false" :label="$t('chart.line_type')" class="form-item">
|
||||
<el-radio-group v-model="sizeForm.lineType" @change="changeBarSizeCase('lineType')">
|
||||
<el-radio-button label="solid">{{ $t('chart.line_type_solid') }}</el-radio-button>
|
||||
<el-radio-button label="dashed">{{ $t('chart.line_type_dashed') }}</el-radio-button>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('chart.line_symbol')" class="form-item">
|
||||
<el-select v-model="sizeForm.lineSymbol" :placeholder="$t('chart.line_symbol')" @change="changeBarSizeCase('lineSymbol')">
|
||||
<el-option
|
||||
v-for="item in lineSymbolOptions"
|
||||
:key="item.value"
|
||||
:label="item.name"
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('chart.line_smooth')" class="form-item">
|
||||
<el-checkbox v-model="sizeForm.lineSmooth" @change="changeBarSizeCase('lineSmooth')">{{ $t('chart.line_smooth') }}</el-checkbox>
|
||||
</el-form-item>
|
||||
<el-divider content-position="center" class="divider-style">{{ $t('chart.chart_scatter') }}</el-divider>
|
||||
<el-form-item :label="$t('chart.bubble_symbol')" class="form-item">
|
||||
<el-select v-model="sizeForm.scatterSymbol" :placeholder="$t('chart.line_symbol')" @change="changeBarSizeCase('scatterSymbol')">
|
||||
<el-option
|
||||
v-for="item in lineSymbolOptions"
|
||||
:key="item.value"
|
||||
:label="item.name"
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('chart.bubble_size')" class="form-item form-item-slider">
|
||||
<el-slider v-model="sizeForm.scatterSymbolSize" show-input :show-input-controls="false" input-size="mini" :min="1" :max="40" @change="changeBarSizeCase('scatterSymbolSize')" />
|
||||
</el-form-item>
|
||||
</span>
|
||||
<!--chart-mix-end-->
|
||||
<!--liquid-begin-->
|
||||
<el-form-item v-show="showProperty('liquidShape')" :label="$t('chart.liquid_shape')" class="form-item">
|
||||
|
||||
@ -258,8 +258,9 @@
|
||||
</el-tooltip>
|
||||
</el-form-item>
|
||||
<el-form-item
|
||||
v-show="showProperty('tableColumnWidth') && sizeForm.tableColumnMode === 'custom'"
|
||||
v-show="showProperty('tableColumnMode') && sizeForm.tableColumnMode === 'custom'"
|
||||
label=""
|
||||
label-width="100px"
|
||||
class="form-item form-item-slider"
|
||||
>
|
||||
<el-slider
|
||||
@ -269,7 +270,7 @@
|
||||
show-input
|
||||
:show-input-controls="false"
|
||||
input-size="mini"
|
||||
@change="changeBarSizeCase('tableColumnWidth')"
|
||||
@change="changeBarSizeCase('tableColumnMode')"
|
||||
/>
|
||||
</el-form-item>
|
||||
<!--table-end-->
|
||||
|
||||
@ -1199,8 +1199,8 @@ export default {
|
||||
...mapState([
|
||||
'curComponent',
|
||||
'panelViewEditInfo',
|
||||
'allViewRender',
|
||||
'componentViewsData'
|
||||
'allViewRender'
|
||||
|
||||
])
|
||||
/* pluginRenderOptions() {
|
||||
const plugins = localStorage.getItem('plugin-views') && JSON.parse(localStorage.getItem('plugin-views')) || []
|
||||
@ -1283,9 +1283,9 @@ export default {
|
||||
this.resetDrill()
|
||||
this.initFromPanel()
|
||||
this.getChart(this.param.id)
|
||||
if (this.componentViewsData[this.param.id]) {
|
||||
this.chart = this.componentViewsData[this.param.id]
|
||||
}
|
||||
// if (this.componentViewsData[this.param.id]) {
|
||||
// this.chart = this.componentViewsData[this.param.id]
|
||||
// }
|
||||
},
|
||||
bindPluginEvent() {
|
||||
bus.$on('show-dimension-edit-filter', this.showDimensionEditFilter)
|
||||
|
||||
@ -4,6 +4,7 @@
|
||||
<svg-icon v-if="currentNode.currentDs.modelInnerType === 'db'" icon-class="ds-db" class="ds-icon-db" />
|
||||
<svg-icon v-else-if="currentNode.currentDs.modelInnerType === 'sql'" icon-class="ds-sql" class="ds-icon-sql" />
|
||||
<svg-icon v-else-if="currentNode.currentDs.modelInnerType === 'excel'" icon-class="ds-excel" class="ds-icon-excel" />
|
||||
<svg-icon v-else-if="currentNode.currentDs.modelInnerType === 'api'" icon-class="ds-api" class="ds-icon-api" />
|
||||
|
||||
<span class="node-name" :title="currentNode.currentDs.name">{{ currentNode.currentDs.name }}</span>
|
||||
|
||||
|
||||
@ -45,6 +45,7 @@ export default {
|
||||
templateStyle: null,
|
||||
templateData: null,
|
||||
dynamicData: null,
|
||||
staticResource: null,
|
||||
snapshot: ''
|
||||
}
|
||||
}
|
||||
@ -120,6 +121,7 @@ export default {
|
||||
this.templateInfo.templateData = this.importTemplateInfo.panelData
|
||||
this.templateInfo.snapshot = this.importTemplateInfo.snapshot
|
||||
this.templateInfo.dynamicData = this.importTemplateInfo.dynamicData
|
||||
this.templateInfo.staticResource = this.importTemplateInfo.staticResource
|
||||
this.templateInfo.nodeType = 'template'
|
||||
}
|
||||
reader.readAsText(file)
|
||||
|
||||
@ -228,6 +228,14 @@
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item v-if="form.type=='oracle'" :label="$t('datasource.targetCharset')">
|
||||
<el-select v-model="form.configuration.targetCharset" filterable
|
||||
:placeholder="$t('datasource.please_choose_targetCharset')"
|
||||
class="select-width">
|
||||
<el-option v-for="item in datasourceType.targetCharset" :key="item" :label="item" :value="item"/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
|
||||
<el-collapse v-if="form.type !=='es' && form.type !== 'api' && form.type !== 'mongo'">
|
||||
<el-collapse-item :title="$t('datasource.priority')" name="1">
|
||||
<el-form-item :label="$t('datasource.initial_pool_size')" prop="configuration.initialPoolSize">
|
||||
|
||||
@ -8,7 +8,7 @@
|
||||
</el-row>
|
||||
<el-row v-show="showView === 'Datasource'">
|
||||
<el-button icon="el-icon-plus" type="text" size="mini" style="float: left;" @click="addFolder"> {{ $t('datasource.create') }}</el-button>
|
||||
<el-button icon="el-icon-setting" type="text" size="mini" style="float: right;" @click="driverMgm"> {{ $t('driver.mgm') }}</el-button>
|
||||
<el-button icon="el-icon-setting" type="text" size="mini" style="float: right;" @click="driverMgm" v-show="user.isAdmin"> {{ $t('driver.mgm') }}</el-button>
|
||||
</el-row>
|
||||
|
||||
<el-row class="title-css" v-show="showView === 'Driver'">
|
||||
@ -199,11 +199,7 @@ export default {
|
||||
desc: [{required: true, message: i18n.t('datasource.input_name'), trigger: 'blur'},
|
||||
{min: 2, max: 200, message: i18n.t('datasource.input_limit_2_25', [2, 25]), trigger: 'blur'}],
|
||||
type: [{required: true, message: i18n.t('datasource.please_choose_type'), trigger: 'blur'}]
|
||||
},
|
||||
editableTabs: [{
|
||||
title: i18n.t('commons.datasource'),
|
||||
name: 'Datasource'
|
||||
}]
|
||||
}
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
@ -219,12 +215,6 @@ export default {
|
||||
created() {
|
||||
this.queryTreeDatas()
|
||||
this.datasourceTypes()
|
||||
if (this.user.isAdmin) {
|
||||
this.editableTabs.push({
|
||||
title: i18n.t('driver.mgm'),
|
||||
name: 'Driver'
|
||||
})
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
filterNode(value, data) {
|
||||
|
||||
@ -9,6 +9,7 @@
|
||||
>
|
||||
<template #toolbar>
|
||||
<el-upload
|
||||
v-permission="['plugin:upload']"
|
||||
:action="baseUrl+'api/plugin/upload'"
|
||||
:multiple="false"
|
||||
:show-file-list="false"
|
||||
@ -54,7 +55,7 @@
|
||||
import LayoutContent from '@/components/business/LayoutContent'
|
||||
import ComplexTable from '@/components/business/complex-table'
|
||||
|
||||
// import { checkPermission } from '@/utils/permission'
|
||||
import { checkPermission } from '@/utils/permission'
|
||||
import { formatCondition, formatQuickCondition } from '@/utils/index'
|
||||
import { pluginLists, uninstall } from '@/api/system/plugin'
|
||||
import { getToken } from '@/utils/auth'
|
||||
@ -72,6 +73,7 @@ export default {
|
||||
// }
|
||||
{
|
||||
label: this.$t('plugin.un_install'), icon: 'el-icon-delete', type: 'danger', click: this.del,
|
||||
show: checkPermission(['plugin:uninstall']),
|
||||
disabled: this.btnDisabled
|
||||
}
|
||||
],
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "dataease-mobile",
|
||||
"version": "1.11.1",
|
||||
"version": "1.11.3",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"serve": "npm run dev:h5",
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
<parent>
|
||||
<artifactId>dataease-server</artifactId>
|
||||
<groupId>io.dataease</groupId>
|
||||
<version>1.11.1</version>
|
||||
<version>1.11.3</version>
|
||||
</parent>
|
||||
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
Loading…
Reference in New Issue
Block a user