diff --git a/backend/pom.xml b/backend/pom.xml
index 88e180d603..cfa77005cb 100644
--- a/backend/pom.xml
+++ b/backend/pom.xml
@@ -486,45 +486,45 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+ org.apache.maven.plugins
+ maven-antrun-plugin
+
+
+
+ main-class-placement
+ generate-resources
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
-
+
-
-
-
-
-
-
-
-
+
+
+
+ run
+
+
+
+
diff --git a/backend/src/main/java/io/dataease/commons/utils/DeFileUtils.java b/backend/src/main/java/io/dataease/commons/utils/DeFileUtils.java
index 4f89d7e4a2..6adc42e9be 100644
--- a/backend/src/main/java/io/dataease/commons/utils/DeFileUtils.java
+++ b/backend/src/main/java/io/dataease/commons/utils/DeFileUtils.java
@@ -65,6 +65,52 @@ public class DeFileUtils {
}
return null;
}
+ public static void copyFolder(String sourcePath,String targetPath) throws Exception{
+ //源文件夹路径
+ File sourceFile = new File(sourcePath);
+ //目标文件夹路径
+ File targetFile = new File(targetPath);
+
+ if(!sourceFile.exists()){
+ throw new Exception("文件夹不存在");
+ }
+ if(!sourceFile.isDirectory()){
+ throw new Exception("源文件夹不是目录");
+ }
+ if(!targetFile.exists()){
+ targetFile.mkdirs();
+ }
+ if(!targetFile.isDirectory()){
+ throw new Exception("目标文件夹不是目录");
+ }
+
+ File[] files = sourceFile.listFiles();
+ if(files == null || files.length == 0){
+ return;
+ }
+
+ for(File file : files){
+ //文件要移动的路径
+ String movePath = targetFile+File.separator+file.getName();
+ if(file.isDirectory()){
+ //如果是目录则递归调用
+ copyFolder(file.getAbsolutePath(),movePath);
+ }else {
+ //如果是文件则复制文件
+ BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));
+ BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(movePath));
+
+ byte[] b = new byte[1024];
+ int temp = 0;
+ while((temp = in.read(b)) != -1){
+ out.write(b,0,temp);
+ }
+ out.close();
+ in.close();
+ }
+ }
+ }
+
public static String copy(File source, String targetDir) throws IOException{
String name = source.getName();
diff --git a/backend/src/main/java/io/dataease/commons/utils/ZipUtils.java b/backend/src/main/java/io/dataease/commons/utils/ZipUtils.java
index edcec34e1b..40bb4b6c40 100644
--- a/backend/src/main/java/io/dataease/commons/utils/ZipUtils.java
+++ b/backend/src/main/java/io/dataease/commons/utils/ZipUtils.java
@@ -56,38 +56,34 @@ public class ZipUtils {
}
public static void unzip(File source, String out) throws IOException {
- try (ZipInputStream zis = new ZipInputStream(new FileInputStream(source))) {
+ ZipInputStream zis = new ZipInputStream(new FileInputStream(source));
+ ZipEntry entry = zis.getNextEntry();
+ while (entry != null) {
+ File file = protectZipSlip(entry.getName(), out);
- ZipEntry entry = zis.getNextEntry();
+ if (entry.isDirectory()) {
+ if (!file.mkdirs()) {
+ }
+ } else {
+ File parent = file.getParentFile();
- while (entry != null) {
-
- File file = protectZipSlip(entry.getName(), out);
-
- if (entry.isDirectory()) {
- if (!file.mkdirs()) {
- }
- } else {
- File parent = file.getParentFile();
-
- if (!parent.exists()) {
- if (!parent.mkdirs()) {
- }
- }
-
- try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file))) {
-
- byte[] buffer = new byte[Math.toIntExact(entry.getSize())];
-
- int location;
-
- while ((location = zis.read(buffer)) != -1) {
- bos.write(buffer, 0, location);
- }
+ if (!parent.exists()) {
+ if (!parent.mkdirs()) {
+ }
+ }
+
+ try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file))) {
+
+ byte[] buffer = new byte[Math.toIntExact(entry.getSize())];
+
+ int location;
+
+ while ((location = zis.read(buffer)) != -1) {
+ bos.write(buffer, 0, location);
}
}
- entry = zis.getNextEntry();
}
+ entry = zis.getNextEntry();
}
}
diff --git a/backend/src/main/java/io/dataease/dto/DatasourceDTO.java b/backend/src/main/java/io/dataease/dto/DatasourceDTO.java
index 18b60ca6ca..2eccf6ef0d 100644
--- a/backend/src/main/java/io/dataease/dto/DatasourceDTO.java
+++ b/backend/src/main/java/io/dataease/dto/DatasourceDTO.java
@@ -2,6 +2,7 @@ package io.dataease.dto;
import com.alibaba.fastjson.JSONArray;
import io.dataease.plugins.common.base.domain.Datasource;
+import io.dataease.plugins.common.constants.DatasourceCalculationMode;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -17,4 +18,5 @@ public class DatasourceDTO extends Datasource {
private String privileges;
private JSONArray apiConfiguration;
private String typeDesc;
+ private DatasourceCalculationMode calculationMode;
}
diff --git a/backend/src/main/java/io/dataease/dto/MyPluginDTO.java b/backend/src/main/java/io/dataease/dto/MyPluginDTO.java
new file mode 100644
index 0000000000..a2dcdd0d1f
--- /dev/null
+++ b/backend/src/main/java/io/dataease/dto/MyPluginDTO.java
@@ -0,0 +1,9 @@
+package io.dataease.dto;
+
+import io.dataease.plugins.common.base.domain.MyPlugin;
+import lombok.Data;
+
+@Data
+public class MyPluginDTO extends MyPlugin {
+ private String require = "1.9.0";
+}
diff --git a/backend/src/main/java/io/dataease/provider/ProviderFactory.java b/backend/src/main/java/io/dataease/provider/ProviderFactory.java
index 04732c99f9..63df829941 100644
--- a/backend/src/main/java/io/dataease/provider/ProviderFactory.java
+++ b/backend/src/main/java/io/dataease/provider/ProviderFactory.java
@@ -24,80 +24,75 @@ public class ProviderFactory implements ApplicationContextAware {
this.context = ctx;
for(final DatasourceTypes d: DatasourceTypes.values()) {
final ConfigurableListableBeanFactory beanFactory = ((ConfigurableApplicationContext) context).getBeanFactory();
- DataSourceType dataSourceType = new DataSourceType();
- dataSourceType.setType(d.getType());
- dataSourceType.setName(d.getName());
- dataSourceType.setAliasPrefix(d.getAliasPrefix());
- dataSourceType.setAliasSuffix(d.getAliasSuffix());
- dataSourceType.setKeywordPrefix(d.getKeywordPrefix());
- dataSourceType.setKeywordSuffix(d.getKeywordSuffix());
- dataSourceType.setPlugin(false);
- dataSourceType.setExtraParams(d.getExtraParams());
- System.out.println(new Gson().toJson(dataSourceType));
- beanFactory.registerSingleton(d.getType(), dataSourceType);
+ if(d.isDatasource()){
+ DataSourceType dataSourceType = new DataSourceType(d.getType(), d.getName(), false, d.getExtraParams(), d.getCalculationMode());
+ beanFactory.registerSingleton(d.getType(), dataSourceType);
+ }
}
}
public static Provider getProvider(String type) {
Map dataSourceTypeMap = SpringContextUtil.getApplicationContext().getBeansOfType((DataSourceType.class));
- if(dataSourceTypeMap.get(type).isPlugin()){
- return context.getBean(type, Provider.class);
+ if(dataSourceTypeMap.keySet().contains(type)){
+ DatasourceTypes datasourceType = DatasourceTypes.valueOf(type);
+ switch (datasourceType) {
+ case es:
+ return context.getBean("es", Provider.class);
+ case api:
+ return context.getBean("api", Provider.class);
+ default:
+ return context.getBean("jdbc", Provider.class);
+ }
}
- DatasourceTypes datasourceType = DatasourceTypes.valueOf(type);
- switch (datasourceType) {
- case es:
- return context.getBean("es", Provider.class);
- case api:
- return context.getBean("api", Provider.class);
- default:
- return context.getBean("jdbc", Provider.class);
- }
+ return SpringContextUtil.getApplicationContext().getBean(type + "DsProvider", Provider.class);
+
}
public static QueryProvider getQueryProvider(String type) {
Map dataSourceTypeMap = SpringContextUtil.getApplicationContext().getBeansOfType((DataSourceType.class));
- if(dataSourceTypeMap.get(type).isPlugin()){
- return context.getBean(type, QueryProvider.class);
- }
- DatasourceTypes datasourceType = DatasourceTypes.valueOf(type);
- switch (datasourceType) {
- case mysql:
- case mariadb:
- case ds_doris:
- case TiDB:
- case StarRocks:
- return context.getBean("mysqlQuery", QueryProvider.class);
- case sqlServer:
- return context.getBean("sqlserverQuery", QueryProvider.class);
- case pg:
- return context.getBean("pgQuery", QueryProvider.class);
- case oracle:
- return context.getBean("oracleQuery", QueryProvider.class);
- case es:
- return context.getBean("esQuery", QueryProvider.class);
- case ck:
- return context.getBean("ckQuery", QueryProvider.class);
- case mongo:
- return context.getBean("mongoQuery", QueryProvider.class);
- case redshift:
- return context.getBean("redshiftQuery", QueryProvider.class);
- case hive:
- return context.getBean("hiveQuery", QueryProvider.class);
- case impala:
- return context.getBean("impalaQuery", QueryProvider.class);
- case db2:
- return context.getBean("db2Query", QueryProvider.class);
- case api:
- return context.getBean("apiQuery", QueryProvider.class);
- case engine_doris:
- return context.getBean("dorisEngineQuery", QueryProvider.class);
- case engine_mysql:
- return context.getBean("mysqlEngineQuery", QueryProvider.class);
- default:
- return context.getBean("mysqlQuery", QueryProvider.class);
+ if(dataSourceTypeMap.keySet().contains(type)){
+ DatasourceTypes datasourceType = DatasourceTypes.valueOf(type);
+ switch (datasourceType) {
+ case mysql:
+ case mariadb:
+ case ds_doris:
+ case TiDB:
+ case StarRocks:
+ return context.getBean("mysqlQuery", QueryProvider.class);
+ case sqlServer:
+ return context.getBean("sqlserverQuery", QueryProvider.class);
+ case pg:
+ return context.getBean("pgQuery", QueryProvider.class);
+ case oracle:
+ return context.getBean("oracleQuery", QueryProvider.class);
+ case es:
+ return context.getBean("esQuery", QueryProvider.class);
+ case ck:
+ return context.getBean("ckQuery", QueryProvider.class);
+ case mongo:
+ return context.getBean("mongoQuery", QueryProvider.class);
+ case redshift:
+ return context.getBean("redshiftQuery", QueryProvider.class);
+ case hive:
+ return context.getBean("hiveQuery", QueryProvider.class);
+ case impala:
+ return context.getBean("impalaQuery", QueryProvider.class);
+ case db2:
+ return context.getBean("db2Query", QueryProvider.class);
+ case api:
+ return context.getBean("apiQuery", QueryProvider.class);
+ case engine_doris:
+ return context.getBean("dorisEngineQuery", QueryProvider.class);
+ case engine_mysql:
+ return context.getBean("mysqlEngineQuery", QueryProvider.class);
+ default:
+ return context.getBean("mysqlQuery", QueryProvider.class);
+ }
}
+
+ return SpringContextUtil.getApplicationContext().getBean(type + "QueryProvider", QueryProvider.class);
}
public static DDLProvider getDDLProvider(String type) {
diff --git a/backend/src/main/java/io/dataease/provider/datasource/JdbcProvider.java b/backend/src/main/java/io/dataease/provider/datasource/JdbcProvider.java
index 7a299c172c..2bd88760f8 100644
--- a/backend/src/main/java/io/dataease/provider/datasource/JdbcProvider.java
+++ b/backend/src/main/java/io/dataease/provider/datasource/JdbcProvider.java
@@ -34,7 +34,7 @@ public class JdbcProvider extends DefaultJdbcProvider {
return false;
}
@Override
- public String getName(){
+ public String getType(){
return "built-in";
}
/**
diff --git a/backend/src/main/java/io/dataease/provider/datasource/MaxCompute.java b/backend/src/main/java/io/dataease/provider/datasource/MaxCompute.java
deleted file mode 100644
index 7272e37d12..0000000000
--- a/backend/src/main/java/io/dataease/provider/datasource/MaxCompute.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package io.dataease.provider.datasource;
-
-import com.alibaba.druid.pool.DruidDataSource;
-import com.google.gson.Gson;
-import io.dataease.plugins.common.constants.DatasourceTypes;
-import io.dataease.plugins.common.dto.datasource.TableDesc;
-import io.dataease.plugins.common.dto.datasource.TableField;
-import io.dataease.plugins.common.exception.DataEaseException;
-import io.dataease.plugins.common.request.datasource.DatasourceRequest;
-import io.dataease.plugins.datasource.entity.JdbcConfiguration;
-import io.dataease.plugins.datasource.provider.DefaultJdbcProvider;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.PostConstruct;
-import java.io.File;
-import java.io.IOException;
-import java.net.URL;
-import java.sql.*;
-import java.util.*;
-
-
-@Component("maxcompute")
-public class MaxCompute extends DefaultJdbcProvider {
-
- @Override
- public String getName(){
- return "maxcompute";
- }
-
- @Override
- public boolean isUseDatasourcePool(){
- return false;
- }
-
- @Override
- public Connection getConnection(DatasourceRequest datasourceRequest) throws Exception {
- Properties props = new Properties();
- MaxcomputeConfig maxcomputeConfig = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), MaxcomputeConfig.class);
- String username = maxcomputeConfig.getUsername();
- String password = maxcomputeConfig.getPassword();
- String driver = maxcomputeConfig.getDriver();
- String url = maxcomputeConfig.getUrl();
- Driver driverClass = (Driver) extendedJdbcClassLoader.loadClass(driver).newInstance();
-
- if (StringUtils.isNotBlank(username)) {
- props.setProperty("user", username);
- if (StringUtils.isNotBlank(password)) {
- props.setProperty("password", password);
- }
- }
- Connection conn = driverClass.connect(url, props);
- return conn;
- }
-
- @Override
- public List getTables(DatasourceRequest datasourceRequest) throws Exception {
- List tables = new ArrayList<>();
- String queryStr = getTablesSql(datasourceRequest);
- try (Connection con = getConnectionFromPool(datasourceRequest); Statement statement = con.createStatement(); ResultSet resultSet = statement.executeQuery(queryStr)) {
- while (resultSet.next()) {
- tables.add(getTableDesc(datasourceRequest, resultSet));
- }
- } catch (Exception e) {
- DataEaseException.throwException(e);
- }
-
- return tables;
- }
-
- private TableDesc getTableDesc(DatasourceRequest datasourceRequest, ResultSet resultSet) throws SQLException {
- TableDesc tableDesc = new TableDesc();
- tableDesc.setName(resultSet.getString(1));
- return tableDesc;
- }
-
- @Override
- public List getTableFileds(DatasourceRequest datasourceRequest) throws Exception {
- datasourceRequest.setQuery("select * from " + datasourceRequest.getTable() + " limit 0");
- return fetchResultField(datasourceRequest);
- }
-
-}
diff --git a/backend/src/main/java/io/dataease/provider/datasource/MaxcomputeConfig.java b/backend/src/main/java/io/dataease/provider/datasource/MaxcomputeConfig.java
deleted file mode 100644
index fcf1416bb6..0000000000
--- a/backend/src/main/java/io/dataease/provider/datasource/MaxcomputeConfig.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package io.dataease.provider.datasource;
-
-import io.dataease.plugins.datasource.entity.JdbcConfiguration;
-import lombok.Getter;
-import lombok.Setter;
-import org.apache.commons.lang3.StringUtils;
-
-@Getter
-@Setter
-public class MaxcomputeConfig extends JdbcConfiguration {
-
- private String driver = "com.aliyun.odps.jdbc.OdpsDriver";
- private String url;
-}
diff --git a/backend/src/main/java/io/dataease/service/datasource/DatasourceService.java b/backend/src/main/java/io/dataease/service/datasource/DatasourceService.java
index eed3f091c8..af17094992 100644
--- a/backend/src/main/java/io/dataease/service/datasource/DatasourceService.java
+++ b/backend/src/main/java/io/dataease/service/datasource/DatasourceService.java
@@ -45,6 +45,7 @@ import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.*;
+import java.util.stream.Collectors;
@Service
@Transactional(rollbackFor = Exception.class)
@@ -62,15 +63,19 @@ public class DatasourceService {
private CommonThreadPool commonThreadPool;
@Resource
private SysAuthService sysAuthService;
-// private static List dsTypes = Arrays.asList("TiDB", "StarRocks", "excel", "mysql", "hive", "impala", "mariadb", "ds_doris", "pg", "sqlServer", "oracle", "mongo", "ck", "db2", "es", "redshift", "api");
public Collectiontypes(){
- return SpringContextUtil.getApplicationContext().getBeansOfType((DataSourceType.class)).values();
+ Collection types = new ArrayList<>();
+ types.addAll(SpringContextUtil.getApplicationContext().getBeansOfType(DataSourceType.class).values());
+ SpringContextUtil.getApplicationContext().getBeansOfType(io.dataease.plugins.datasource.service.DatasourceService.class).values().forEach(datasourceService -> {
+ types.add(datasourceService.getDataSourceType());
+ });
+ return types;
}
@DeCleaner(DePermissionType.DATASOURCE)
public Datasource addDatasource(Datasource datasource) throws Exception{
- if(!SpringContextUtil.getApplicationContext().getBeansOfType(DataSourceType.class).keySet().contains(datasource.getType())){
+ if(!types().stream().map(DataSourceType::getType).collect(Collectors.toList()).contains(datasource.getType())){
throw new Exception("Datasource type not supported.");
}
checkName(datasource.getName(),datasource.getType(), datasource.getId());
@@ -104,7 +109,12 @@ public class DatasourceService {
request.setSort("update_time desc");
List datasourceDTOS = extDataSourceMapper.queryUnion(request);
datasourceDTOS.forEach(datasourceDTO -> {
- datasourceDTO.setTypeDesc(SpringContextUtil.getApplicationContext().getBean(datasourceDTO.getType(), DataSourceType.class).getName());
+ types().forEach(dataSourceType -> {
+ if(dataSourceType.getType().equalsIgnoreCase(datasourceDTO.getType())){
+ datasourceDTO.setTypeDesc(dataSourceType.getName());
+ datasourceDTO.setCalculationMode(dataSourceType.getCalculationMode());
+ }
+ });
if(datasourceDTO.getType().equalsIgnoreCase(DatasourceTypes.api.toString())){
JSONArray apiDefinitionList = JSONObject.parseArray(datasourceDTO.getConfiguration());
JSONArray apiDefinitionListWithStatus = new JSONArray();
@@ -165,7 +175,7 @@ public class DatasourceService {
}
public void updateDatasource(UpdataDsRequest updataDsRequest)throws Exception{
- if(!SpringContextUtil.getApplicationContext().getBeansOfType(DataSourceType.class).keySet().contains(updataDsRequest.getType())){
+ if(!types().stream().map(DataSourceType::getType).collect(Collectors.toList()).contains(updataDsRequest.getType())){
throw new Exception("Datasource type not supported.");
}
checkName(updataDsRequest.getName(),updataDsRequest.getType(),updataDsRequest.getId());
diff --git a/backend/src/main/java/io/dataease/service/sys/PluginService.java b/backend/src/main/java/io/dataease/service/sys/PluginService.java
index f6282e2a4d..0627830715 100644
--- a/backend/src/main/java/io/dataease/service/sys/PluginService.java
+++ b/backend/src/main/java/io/dataease/service/sys/PluginService.java
@@ -2,6 +2,7 @@ package io.dataease.service.sys;
import cn.hutool.core.io.FileUtil;
import com.google.gson.Gson;
+import io.dataease.dto.MyPluginDTO;
import io.dataease.ext.ExtSysPluginMapper;
import io.dataease.ext.query.GridExample;
import io.dataease.commons.constants.AuthConstants;
@@ -65,13 +66,13 @@ public class PluginService {
* @param file
* @return
*/
- public Map localInstall(MultipartFile file) {
+ public Map localInstall(MultipartFile file) throws Exception{
//1.上传文件到服务器pluginDir目录下
File dest = DeFileUtils.upload(file, pluginDir + "temp/");
//2.解压目标文件dest 得到plugin.json和jar
String folder = pluginDir + "folder/";
try {
- ZipUtils.upZipFile(dest, folder);
+ ZipUtils.unzip(dest, folder);
} catch (IOException e) {
DeFileUtils.deleteFile(pluginDir + "temp/");
DeFileUtils.deleteFile(folder);
@@ -90,7 +91,7 @@ public class PluginService {
LogUtil.error(msg);
DEException.throwException(new RuntimeException(msg));
}
- MyPlugin myPlugin = formatJsonFile(jsonFiles[0]);
+ MyPluginDTO myPlugin = formatJsonFile(jsonFiles[0]);
if (!versionMatch(myPlugin.getRequire())) {
String msg = "当前插件要求系统版本最低为:" + myPlugin.getRequire();
@@ -118,6 +119,9 @@ public class PluginService {
targetDir = makeTargetDir(myPlugin);
String jarPath;
jarPath = DeFileUtils.copy(jarFile, targetDir);
+ if(myPlugin.getCategory().equalsIgnoreCase("datasource")){
+ DeFileUtils.copyFolder(folder + "/" + myPlugin.getDsType() + "Driver", targetDir + myPlugin.getDsType() + "Driver");
+ }
loadJar(jarPath, myPlugin);
myPluginMapper.insert(myPlugin);
@@ -192,6 +196,11 @@ public class PluginService {
String path = pluginDir + plugin.getStore() + "/" + fileName;
File jarFile = new File(path);
FileUtil.del(jarFile);
+
+ if(plugin.getCategory().equalsIgnoreCase("datasource")){
+ File driverFile = new File(pluginDir + plugin.getStore() + "/" + plugin.getDsType() + "Driver");
+ FileUtil.del(driverFile);
+ }
}
/**
@@ -224,13 +233,13 @@ public class PluginService {
*
* @return
*/
- private MyPlugin formatJsonFile(File file) {
+ private MyPluginDTO formatJsonFile(File file) {
String str = DeFileUtils.readJson(file);
Gson gson = new Gson();
Map myPlugin = gson.fromJson(str, Map.class);
myPlugin.put("free", (Double) myPlugin.get("free") > 0.0);
- myPlugin.put("loadMybatis", (Double) myPlugin.get("loadMybatis") > 0.0);
- MyPlugin result = new MyPlugin();
+ myPlugin.put("loadMybatis", myPlugin.get("loadMybatis") == null ? false : (Double) myPlugin.get("loadMybatis") > 0.0);
+ MyPluginDTO result = new MyPluginDTO();
try {
org.apache.commons.beanutils.BeanUtils.populate(result, myPlugin);
result.setInstallTime(System.currentTimeMillis());
@@ -240,6 +249,10 @@ public class PluginService {
e.printStackTrace();
}
//BeanUtils.copyBean(result, myPlugin);
+ if(result.getCategory().equalsIgnoreCase("datasource")){
+ result.setStore("thirdpart");
+ }
+
return result;
}
diff --git a/frontend/src/api/dataset/dataset.js b/frontend/src/api/dataset/dataset.js
index 920baa29fe..2f620748da 100644
--- a/frontend/src/api/dataset/dataset.js
+++ b/frontend/src/api/dataset/dataset.js
@@ -213,5 +213,4 @@ export function checkCustomDs() {
loading: true
})
}
-export const disabledSyncDs= ['es', 'ck', 'mongo', 'redshift', 'hive', 'impala']
export default { loadTable, getScene, addGroup, delGroup, addTable, delTable, groupTree, checkCustomDs }
diff --git a/frontend/src/components/AsyncComponent/index.vue b/frontend/src/components/AsyncComponent/index.vue
index 7c0b613372..b1d4964692 100644
--- a/frontend/src/components/AsyncComponent/index.vue
+++ b/frontend/src/components/AsyncComponent/index.vue
@@ -70,7 +70,7 @@ export default {
}, */
callPluginInner(param) {
const { methodName, methodParam } = param
- this.$refs[this.refId] && this.$refs[this.refId][methodName] && this.$refs[this.refId][methodName](methodParam)
+ return this.$refs[this.refId] && this.$refs[this.refId][methodName] && this.$refs[this.refId][methodName](methodParam)
}
}
}
diff --git a/frontend/src/lang/en.js b/frontend/src/lang/en.js
index 1a98d948fa..0f012d01ac 100644
--- a/frontend/src/lang/en.js
+++ b/frontend/src/lang/en.js
@@ -2,7 +2,7 @@ export default {
fu: {
search_bar: {
search: 'Search',
- adv_search: 'Advanced search',
+ adv_search: 'Advarequirednced search',
ok: 'Confirm',
cancel: 'Cancel',
please_select: 'Please select',
@@ -278,7 +278,7 @@ export default {
id: 'ID',
millisecond: 'Millisecond',
cannot_be_null: 'Cannot be null',
- required: '{0} is required',
+ required: 'Required',
already_exists: 'Already Exists',
modifier: 'Modifier',
validate: 'Validate',
diff --git a/frontend/src/lang/tw.js b/frontend/src/lang/tw.js
index 57da2c32a8..3375fb1d96 100644
--- a/frontend/src/lang/tw.js
+++ b/frontend/src/lang/tw.js
@@ -278,7 +278,7 @@ export default {
id: 'ID',
millisecond: '毫秒',
cannot_be_null: '不能爲空',
- required: '{0}是必填的',
+ required: '必填',
already_exists: '名稱不能重複',
modifier: '修改人',
validate: '校驗',
diff --git a/frontend/src/views/dataset/add/AddDB.vue b/frontend/src/views/dataset/add/AddDB.vue
index 2df9aba58a..03d3ed3e71 100644
--- a/frontend/src/views/dataset/add/AddDB.vue
+++ b/frontend/src/views/dataset/add/AddDB.vue
@@ -69,7 +69,7 @@