Compare commits

...

25 Commits

Author SHA1 Message Date
taojinlong
7713210044 refactor: 升级版本号 2022-06-26 20:43:36 +08:00
taojinlong
0fc632915d fix: 抽取数据 2022-06-26 15:37:06 +08:00
taojinlong
93e4abeb9a fix: 抽取数据 2022-06-26 00:20:13 +08:00
taojinlong
7d25fdf8cd fix: 尝试修复支持数据库字符集 2022-06-26 00:20:10 +08:00
taojinlong
c7d0415c54 fix: 尝试修复支持数据库字符集 2022-06-26 00:20:08 +08:00
taojinlong
64adee61f5 fix: 尝试修复支持数据库字符集 2022-06-26 00:20:05 +08:00
junjun
5a56b87acd fix: 恢复视图样式 2022-06-22 13:51:36 +08:00
taojinlong
91cbc4abd4 Merge branch 'v1.11' of github.com:dataease/dataease into v1.11 2022-06-17 11:37:52 +08:00
taojinlong
be61ae643b fix: 同步字段时,顺序错误 2022-06-17 11:37:43 +08:00
wangjiahao
08d3b26deb Merge remote-tracking branch 'origin/v1.11' into v1.11 2022-06-16 16:17:28 +08:00
wangjiahao
dec58a71ba fix: 数据集预览和更新增加数据源权限校验,防止使用无权限数据源执行sql 2022-06-16 16:17:11 +08:00
junjun
466f8d4ce5 fix: 修复关联数据集中缺失api数据集图标 2022-06-16 15:26:19 +08:00
wangjiahao
832d74f12f Merge remote-tracking branch 'origin/v1.11' into v1.11 2022-06-16 14:45:15 +08:00
wangjiahao
5f611d3e39 fix: 插件操作加入权限控制,解决普通用户或者API能越权上传卸载插件问题 2022-06-16 14:44:54 +08:00
taojinlong
ba59aa4158 fix: 校验驱动ID 2022-06-16 14:17:18 +08:00
wangjiahao
52e2faa157 fix: 修复模板管理中导入模板未存储静态文件的问题 2022-06-16 11:39:05 +08:00
wangjiahao
13ca0954e6 fix: pdf导出截屏不全问题 2022-06-15 10:06:08 +08:00
junjun
3251396f86 fix: 去掉地图样式中大小选项 2022-06-13 17:10:24 +08:00
junjun
b98d873c16 fix: 恢复表格列宽设置项 2022-06-10 17:32:00 +08:00
junjun
04179b2534 fix: 修复辅助线再次编辑确认会消失的问题 2022-06-08 15:49:02 +08:00
junjun
e44acadabc fix: 恢复图例垂直位置选项 2022-06-08 15:01:33 +08:00
wangjiahao
48370a3dbb fix: 修复部分类型视图无法自定义颜色的问题 2022-06-07 18:16:30 +08:00
taojinlong
b5d4ec737f fix: 驱动管理只对管理员可见 2022-06-07 16:08:10 +08:00
taojinlong
60babbf91d Merge branch 'v1.11' of github.com:dataease/dataease into v1.11 2022-06-07 16:07:49 +08:00
taojinlong
b013190d6c fix: 获取枚举值空指针 2022-06-01 17:21:44 +08:00
36 changed files with 274 additions and 181 deletions

View File

@ -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>

View File

@ -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);
}

View File

@ -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;

View File

@ -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());
// }
}

View File

@ -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);
}

View File

@ -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();

View File

@ -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 数据库中多余的字段

View File

@ -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" +

View File

@ -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;

View File

@ -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());

View 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);

View File

@ -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.

View File

@ -159,3 +159,4 @@ I18N_TIME=操作时间
I18N_DRIVER_NOT_DELETE=使用中的驱动不允许删除
I18N_DRIVER_REPEAT_NAME=名称重复
I18N_DRIVER_NOT_FOUND=未找到驱动

View File

@ -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=未找到驅動

View File

@ -1,6 +1,6 @@
{
"name": "dataease",
"version": "1.11.1",
"version": "1.11.3",
"description": "dataease front",
"private": true,
"scripts": {

View File

@ -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>

View File

@ -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)
}
}
}

View File

@ -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')
}
}
}
}

View File

@ -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?',

View File

@ -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: '已經存在相同配置的數據源信息,',

View File

@ -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: '确认保存?',

View File

@ -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',

View File

@ -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>

View File

@ -86,6 +86,7 @@ export default {
} else {
this.assistLine = []
}
this.lineArr = JSON.parse(JSON.stringify(this.assistLine))
}
},
changeAssistLine() {

View File

@ -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)
}
}
}
}

View File

@ -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">

View File

@ -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-->

View File

@ -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)

View File

@ -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>

View File

@ -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)

View 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">

View File

@ -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) {

View File

@ -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
}
],

View File

@ -1,6 +1,6 @@
{
"name": "dataease-mobile",
"version": "1.11.1",
"version": "1.11.3",
"private": true,
"scripts": {
"serve": "npm run dev:h5",

View File

@ -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>

View File

@ -4,7 +4,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>io.dataease</groupId>
<artifactId>dataease-server</artifactId>
<version>1.11.1</version>
<version>1.11.3</version>
<packaging>pom</packaging>
<parent>