forked from github/dataease
Merge remote-tracking branch 'origin/dev' into pr@dev@panel
# Conflicts: # frontend/src/views/chart/view/ChartEdit.vue
This commit is contained in:
commit
c05e4b842d
@ -46,6 +46,10 @@ public class ShiroServiceImpl implements ShiroService {
|
|||||||
|
|
||||||
|
|
||||||
filterChainDefinitionMap.put("/system/ui/**", ANON);
|
filterChainDefinitionMap.put("/system/ui/**", ANON);
|
||||||
|
filterChainDefinitionMap.put("/**/*.js", ANON);
|
||||||
|
filterChainDefinitionMap.put("/**/*.css", ANON);
|
||||||
|
filterChainDefinitionMap.put("/**/*.map", ANON);
|
||||||
|
// filterChainDefinitionMap.put("/axios.map", ANON);
|
||||||
|
|
||||||
filterChainDefinitionMap.put("/api/auth/login", ANON);
|
filterChainDefinitionMap.put("/api/auth/login", ANON);
|
||||||
filterChainDefinitionMap.put("/api/auth/logout", ANON);
|
filterChainDefinitionMap.put("/api/auth/logout", ANON);
|
||||||
|
@ -12,6 +12,8 @@ public interface ExtPanelShareMapper {
|
|||||||
|
|
||||||
int batchInsert(@Param("shares") List<PanelShare> shares);
|
int batchInsert(@Param("shares") List<PanelShare> shares);
|
||||||
|
|
||||||
|
int batchDelete(@Param("shareIds") List<Long> shareIds);
|
||||||
|
|
||||||
List<PanelSharePo> query(Map<String, Object> param);
|
List<PanelSharePo> query(Map<String, Object> param);
|
||||||
|
|
||||||
List<PanelShare> queryWithResource(GridExample example);
|
List<PanelShare> queryWithResource(GridExample example);
|
||||||
|
@ -16,6 +16,14 @@
|
|||||||
</foreach>
|
</foreach>
|
||||||
</insert>
|
</insert>
|
||||||
|
|
||||||
|
<delete id="batchDelete" parameterType="java.lang.Long" >
|
||||||
|
delete from panel_share
|
||||||
|
where share_id in
|
||||||
|
<foreach collection="shareIds" item="shareId" open="(" separator="," close=")" >
|
||||||
|
#{shareId}
|
||||||
|
</foreach>
|
||||||
|
</delete>
|
||||||
|
|
||||||
<select id="query" resultMap="treeNodeMap">
|
<select id="query" resultMap="treeNodeMap">
|
||||||
select distinct s.panel_group_id as id, g.create_by as creator, g.name
|
select distinct s.panel_group_id as id, g.create_by as creator, g.name
|
||||||
from panel_share s
|
from panel_share s
|
||||||
|
@ -0,0 +1,36 @@
|
|||||||
|
package io.dataease.base.mapper.ext;
|
||||||
|
|
||||||
|
import org.apache.ibatis.annotations.Delete;
|
||||||
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
import org.apache.ibatis.annotations.Update;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Mapper
|
||||||
|
public interface ExtSysMsgMapper {
|
||||||
|
|
||||||
|
|
||||||
|
@Update({
|
||||||
|
"<script>",
|
||||||
|
"update sys_msg set status = 1 where msg_id in ",
|
||||||
|
"<foreach collection='msgIds' item='msgId' open='(' separator=',' close=')' >",
|
||||||
|
" #{msgId}",
|
||||||
|
"</foreach>",
|
||||||
|
"</script>"
|
||||||
|
})
|
||||||
|
int batchStatus(@Param("msgIds") List<Long> msgIds);
|
||||||
|
|
||||||
|
|
||||||
|
@Delete({
|
||||||
|
"<script>",
|
||||||
|
"delete from sys_msg where msg_id in ",
|
||||||
|
"<foreach collection='msgIds' item='msgId' open='(' separator=',' close=')' >",
|
||||||
|
" #{msgId}",
|
||||||
|
"</foreach>",
|
||||||
|
"</script>"
|
||||||
|
})
|
||||||
|
int batchDelete(@Param("msgIds") List<Long> msgIds);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -36,4 +36,15 @@ public class MsgController {
|
|||||||
public void setReaded(@PathVariable Long msgId) {
|
public void setReaded(@PathVariable Long msgId) {
|
||||||
sysMsgService.setReaded(msgId);
|
sysMsgService.setReaded(msgId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@PostMapping("/batchRead")
|
||||||
|
public void batchRead(@RequestBody List<Long> msgIds) {
|
||||||
|
sysMsgService.setBatchReaded(msgIds);
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("/batchDelete")
|
||||||
|
public void batchDelete(@RequestBody List<Long> msgIds) {
|
||||||
|
sysMsgService.batchDelete(msgIds);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,11 +3,16 @@ package io.dataease.controller.message.dto;
|
|||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
public class MsgRequest implements Serializable {
|
public class MsgRequest implements Serializable {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1920091635946508658L;
|
||||||
|
|
||||||
private Integer type;
|
private Integer type;
|
||||||
|
|
||||||
private Boolean status;
|
private Boolean status;
|
||||||
|
|
||||||
|
private List<String> orders;
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package io.dataease.controller.panel.api;
|
package io.dataease.controller.panel.api;
|
||||||
|
|
||||||
import io.dataease.base.domain.PanelShare;
|
import io.dataease.base.domain.PanelShare;
|
||||||
|
import io.dataease.controller.request.panel.PanelShareFineDto;
|
||||||
import io.dataease.controller.request.panel.PanelShareRequest;
|
import io.dataease.controller.request.panel.PanelShareRequest;
|
||||||
import io.dataease.controller.sys.base.BaseGridRequest;
|
import io.dataease.controller.sys.base.BaseGridRequest;
|
||||||
import io.dataease.dto.panel.PanelShareDto;
|
import io.dataease.dto.panel.PanelShareDto;
|
||||||
@ -31,5 +32,9 @@ public interface ShareApi {
|
|||||||
@PostMapping("/queryWithResourceId")
|
@PostMapping("/queryWithResourceId")
|
||||||
List<PanelShare> queryWithResourceId(BaseGridRequest request);
|
List<PanelShare> queryWithResourceId(BaseGridRequest request);
|
||||||
|
|
||||||
|
|
||||||
|
@ApiOperation("优化创建分享")
|
||||||
|
@PostMapping("/fineSave")
|
||||||
|
void fineSave(PanelShareFineDto panelShareFineDto);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,7 @@ package io.dataease.controller.panel.server;
|
|||||||
|
|
||||||
import io.dataease.base.domain.PanelShare;
|
import io.dataease.base.domain.PanelShare;
|
||||||
import io.dataease.controller.panel.api.ShareApi;
|
import io.dataease.controller.panel.api.ShareApi;
|
||||||
|
import io.dataease.controller.request.panel.PanelShareFineDto;
|
||||||
import io.dataease.controller.request.panel.PanelShareRequest;
|
import io.dataease.controller.request.panel.PanelShareRequest;
|
||||||
import io.dataease.controller.sys.base.BaseGridRequest;
|
import io.dataease.controller.sys.base.BaseGridRequest;
|
||||||
import io.dataease.dto.panel.PanelShareDto;
|
import io.dataease.dto.panel.PanelShareDto;
|
||||||
@ -32,4 +33,11 @@ public class ShareServer implements ShareApi {
|
|||||||
public List<PanelShare> queryWithResourceId(@RequestBody BaseGridRequest request) {
|
public List<PanelShare> queryWithResourceId(@RequestBody BaseGridRequest request) {
|
||||||
return shareService.queryWithResource(request);
|
return shareService.queryWithResource(request);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void fineSave(@RequestBody PanelShareFineDto panelShareFineDto) {
|
||||||
|
shareService.fineSave(panelShareFineDto);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -0,0 +1,18 @@
|
|||||||
|
package io.dataease.controller.request.panel;
|
||||||
|
|
||||||
|
import io.dataease.commons.model.AuthURD;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class PanelShareFineDto implements Serializable {
|
||||||
|
|
||||||
|
|
||||||
|
private static final long serialVersionUID = -792964171742204428L;
|
||||||
|
|
||||||
|
private String resourceId;
|
||||||
|
|
||||||
|
private AuthURD authURD;
|
||||||
|
}
|
@ -61,4 +61,11 @@ public class DatasourceController {
|
|||||||
public List<DBTableDTO> getTables(@RequestBody Datasource datasource) throws Exception {
|
public List<DBTableDTO> getTables(@RequestBody Datasource datasource) throws Exception {
|
||||||
return datasourceService.getTables(datasource);
|
return datasourceService.getTables(datasource);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@PostMapping("/getSchema")
|
||||||
|
public List<String> getSchema(@RequestBody Datasource datasource) throws Exception {
|
||||||
|
return datasourceService.getSchema(datasource);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,7 @@ public class OracleConfigration extends JdbcDTO {
|
|||||||
|
|
||||||
private String driver = "oracle.jdbc.driver.OracleDriver";
|
private String driver = "oracle.jdbc.driver.OracleDriver";
|
||||||
private String connectionType;
|
private String connectionType;
|
||||||
|
private String schema;
|
||||||
|
|
||||||
public String getJdbc() {
|
public String getJdbc() {
|
||||||
// 连接参数先写死,后边要把编码、时区等参数放到数据源的设置中
|
// 连接参数先写死,后边要把编码、时区等参数放到数据源的设置中
|
||||||
|
@ -30,4 +30,6 @@ public abstract class DatasourceProvider {
|
|||||||
abstract public Map<String, List> fetchResultAndField(DatasourceRequest datasourceRequest) throws Exception;
|
abstract public Map<String, List> fetchResultAndField(DatasourceRequest datasourceRequest) throws Exception;
|
||||||
|
|
||||||
abstract public void handleDatasource(DatasourceRequest datasourceRequest, String type) throws Exception;
|
abstract public void handleDatasource(DatasourceRequest datasourceRequest, String type) throws Exception;
|
||||||
|
|
||||||
|
abstract public List<String> getSchema(DatasourceRequest datasourceRequest) throws Exception;
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,7 @@ package io.dataease.datasource.provider;
|
|||||||
|
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
import com.mchange.v2.c3p0.ComboPooledDataSource;
|
import com.mchange.v2.c3p0.ComboPooledDataSource;
|
||||||
|
import io.dataease.controller.handler.annotation.I18n;
|
||||||
import io.dataease.datasource.constants.DatasourceTypes;
|
import io.dataease.datasource.constants.DatasourceTypes;
|
||||||
import io.dataease.datasource.dto.MysqlConfigration;
|
import io.dataease.datasource.dto.MysqlConfigration;
|
||||||
import io.dataease.datasource.dto.OracleConfigration;
|
import io.dataease.datasource.dto.OracleConfigration;
|
||||||
@ -9,10 +10,12 @@ import io.dataease.datasource.dto.SqlServerConfigration;
|
|||||||
import io.dataease.datasource.dto.TableFiled;
|
import io.dataease.datasource.dto.TableFiled;
|
||||||
import io.dataease.datasource.request.DatasourceRequest;
|
import io.dataease.datasource.request.DatasourceRequest;
|
||||||
import io.dataease.exception.DataEaseException;
|
import io.dataease.exception.DataEaseException;
|
||||||
|
import io.dataease.i18n.Translator;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import java.beans.PropertyVetoException;
|
import java.beans.PropertyVetoException;
|
||||||
import java.sql.*;
|
import java.sql.*;
|
||||||
|
import java.text.MessageFormat;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
@Service("jdbc")
|
@Service("jdbc")
|
||||||
@ -212,6 +215,31 @@ public class JdbcProvider extends DatasourceProvider {
|
|||||||
return new ArrayList<>();
|
return new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<String> getSchema(DatasourceRequest datasourceRequest) throws Exception {
|
||||||
|
List<String> schemas = new ArrayList<>();
|
||||||
|
String queryStr = getSchemaSql(datasourceRequest);
|
||||||
|
Connection con = null;
|
||||||
|
try {
|
||||||
|
con = getConnection(datasourceRequest);
|
||||||
|
Statement statement = con.createStatement();
|
||||||
|
ResultSet resultSet = statement.executeQuery(queryStr);
|
||||||
|
while (resultSet.next()) {
|
||||||
|
schemas.add(resultSet.getString(1));
|
||||||
|
}
|
||||||
|
resultSet.close();
|
||||||
|
statement.close();
|
||||||
|
return schemas;
|
||||||
|
} catch (Exception e) {
|
||||||
|
DataEaseException.throwException(e);
|
||||||
|
} finally {
|
||||||
|
if(con != null){
|
||||||
|
con.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<TableFiled> getTableFileds(DatasourceRequest datasourceRequest) throws Exception {
|
public List<TableFiled> getTableFileds(DatasourceRequest datasourceRequest) throws Exception {
|
||||||
List<TableFiled> list = new LinkedList<>();
|
List<TableFiled> list = new LinkedList<>();
|
||||||
@ -466,7 +494,7 @@ public class JdbcProvider extends DatasourceProvider {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getTablesSql(DatasourceRequest datasourceRequest) {
|
private String getTablesSql(DatasourceRequest datasourceRequest) throws Exception {
|
||||||
DatasourceTypes datasourceType = DatasourceTypes.valueOf(datasourceRequest.getDatasource().getType());
|
DatasourceTypes datasourceType = DatasourceTypes.valueOf(datasourceRequest.getDatasource().getType());
|
||||||
switch (datasourceType) {
|
switch (datasourceType) {
|
||||||
case mysql:
|
case mysql:
|
||||||
@ -477,7 +505,21 @@ public class JdbcProvider extends DatasourceProvider {
|
|||||||
SqlServerConfigration sqlServerConfigration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), SqlServerConfigration.class);
|
SqlServerConfigration sqlServerConfigration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), SqlServerConfigration.class);
|
||||||
return "SELECT TABLE_NAME FROM DATABASE.INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE';".replace("DATABASE", sqlServerConfigration.getDataBase());
|
return "SELECT TABLE_NAME FROM DATABASE.INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE';".replace("DATABASE", sqlServerConfigration.getDataBase());
|
||||||
case oracle:
|
case oracle:
|
||||||
return "select TABLE_NAME from USER_TABLES";
|
OracleConfigration oracleConfigration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), OracleConfigration.class);
|
||||||
|
if(StringUtils.isEmpty(oracleConfigration.getSchema())){
|
||||||
|
throw new Exception(Translator.get("i18n_schema_is_empty"));
|
||||||
|
}
|
||||||
|
return "select table_name, owner from all_tables where owner='" + oracleConfigration.getSchema() + "'";
|
||||||
|
default:
|
||||||
|
return "show tables;";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getSchemaSql(DatasourceRequest datasourceRequest) {
|
||||||
|
DatasourceTypes datasourceType = DatasourceTypes.valueOf(datasourceRequest.getDatasource().getType());
|
||||||
|
switch (datasourceType) {
|
||||||
|
case oracle:
|
||||||
|
return "select * from all_users";
|
||||||
default:
|
default:
|
||||||
return "show tables;";
|
return "show tables;";
|
||||||
}
|
}
|
||||||
|
@ -120,6 +120,13 @@ public class DatasourceService {
|
|||||||
datasourceProvider.checkStatus(datasourceRequest);
|
datasourceProvider.checkStatus(datasourceRequest);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<String> getSchema(Datasource datasource) throws Exception {
|
||||||
|
DatasourceProvider datasourceProvider = ProviderFactory.getProvider(datasource.getType());
|
||||||
|
DatasourceRequest datasourceRequest = new DatasourceRequest();
|
||||||
|
datasourceRequest.setDatasource(datasource);
|
||||||
|
return datasourceProvider.getSchema(datasourceRequest);
|
||||||
|
}
|
||||||
|
|
||||||
public List<DBTableDTO> getTables(Datasource datasource) throws Exception {
|
public List<DBTableDTO> getTables(Datasource datasource) throws Exception {
|
||||||
Datasource ds = datasourceMapper.selectByPrimaryKey(datasource.getId());
|
Datasource ds = datasourceMapper.selectByPrimaryKey(datasource.getId());
|
||||||
DatasourceProvider datasourceProvider = ProviderFactory.getProvider(ds.getType());
|
DatasourceProvider datasourceProvider = ProviderFactory.getProvider(ds.getType());
|
||||||
|
@ -193,11 +193,14 @@ public class DorisQueryProvider extends QueryProvider {
|
|||||||
filter.append(" AND ").append(x.getDataeaseName());
|
filter.append(" AND ").append(x.getDataeaseName());
|
||||||
}
|
}
|
||||||
filter.append(transMysqlFilterTerm(f.getTerm()));
|
filter.append(transMysqlFilterTerm(f.getTerm()));
|
||||||
if (StringUtils.containsIgnoreCase(f.getTerm(), "null")) {
|
if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) {
|
||||||
|
filter.append("(null,'')");
|
||||||
|
} else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) {
|
||||||
|
filter.append(" AND ").append(x.getDataeaseName()).append(" <> ''");
|
||||||
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) {
|
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) {
|
||||||
filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')");
|
filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')");
|
||||||
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) {
|
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) {
|
||||||
filter.append("%").append(f.getValue()).append("%");
|
filter.append("'%").append(f.getValue()).append("%'");
|
||||||
} else {
|
} else {
|
||||||
filter.append("'").append(f.getValue()).append("'");
|
filter.append("'").append(f.getValue()).append("'");
|
||||||
}
|
}
|
||||||
@ -229,11 +232,16 @@ public class DorisQueryProvider extends QueryProvider {
|
|||||||
filter.append(" AND _").append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getDataeaseName(), "*") ? "" : y.getDataeaseName());
|
filter.append(" AND _").append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getDataeaseName(), "*") ? "" : y.getDataeaseName());
|
||||||
}
|
}
|
||||||
filter.append(transMysqlFilterTerm(f.getTerm()));
|
filter.append(transMysqlFilterTerm(f.getTerm()));
|
||||||
if (StringUtils.containsIgnoreCase(f.getTerm(), "null")) {
|
if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) {
|
||||||
|
filter.append("(null)");
|
||||||
|
} else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) {
|
||||||
|
// filter.append(" AND _")
|
||||||
|
// .append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getDataeaseName(), "*") ? "" : y.getDataeaseName())
|
||||||
|
// .append(" <> ''");
|
||||||
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) {
|
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) {
|
||||||
filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')");
|
filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')");
|
||||||
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) {
|
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) {
|
||||||
filter.append("%").append(f.getValue()).append("%");
|
filter.append("'%").append(f.getValue()).append("%'");
|
||||||
} else {
|
} else {
|
||||||
filter.append("'").append(f.getValue()).append("'");
|
filter.append("'").append(f.getValue()).append("'");
|
||||||
}
|
}
|
||||||
@ -310,11 +318,16 @@ public class DorisQueryProvider extends QueryProvider {
|
|||||||
filter.append(" AND _").append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getDataeaseName(), "*") ? "" : y.getDataeaseName());
|
filter.append(" AND _").append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getDataeaseName(), "*") ? "" : y.getDataeaseName());
|
||||||
}
|
}
|
||||||
filter.append(transMysqlFilterTerm(f.getTerm()));
|
filter.append(transMysqlFilterTerm(f.getTerm()));
|
||||||
if (StringUtils.containsIgnoreCase(f.getTerm(), "null")) {
|
if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) {
|
||||||
|
filter.append("(null)");
|
||||||
|
} else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) {
|
||||||
|
// filter.append(" AND _")
|
||||||
|
// .append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getDataeaseName(), "*") ? "" : y.getDataeaseName())
|
||||||
|
// .append(" <> ''");
|
||||||
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) {
|
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) {
|
||||||
filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')");
|
filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')");
|
||||||
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) {
|
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) {
|
||||||
filter.append("%").append(f.getValue()).append("%");
|
filter.append("'%").append(f.getValue()).append("%'");
|
||||||
} else {
|
} else {
|
||||||
filter.append("'").append(f.getValue()).append("'");
|
filter.append("'").append(f.getValue()).append("'");
|
||||||
}
|
}
|
||||||
@ -349,7 +362,7 @@ public class DorisQueryProvider extends QueryProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String createRawQuerySQL(String table, List<DatasetTableField> fields){
|
public String createRawQuerySQL(String table, List<DatasetTableField> fields) {
|
||||||
String[] array = fields.stream().map(f -> {
|
String[] array = fields.stream().map(f -> {
|
||||||
StringBuilder stringBuilder = new StringBuilder();
|
StringBuilder stringBuilder = new StringBuilder();
|
||||||
stringBuilder.append("`").append(f.getOriginName()).append("` AS ").append(f.getDataeaseName());
|
stringBuilder.append("`").append(f.getOriginName()).append("` AS ").append(f.getDataeaseName());
|
||||||
@ -393,7 +406,7 @@ public class DorisQueryProvider extends QueryProvider {
|
|||||||
case "not like":
|
case "not like":
|
||||||
return " NOT LIKE ";
|
return " NOT LIKE ";
|
||||||
case "null":
|
case "null":
|
||||||
return " IS NULL ";
|
return " IN ";
|
||||||
case "not_null":
|
case "not_null":
|
||||||
return " IS NOT NULL ";
|
return " IS NOT NULL ";
|
||||||
case "between":
|
case "between":
|
||||||
@ -424,7 +437,10 @@ public class DorisQueryProvider extends QueryProvider {
|
|||||||
filter.append(" ")
|
filter.append(" ")
|
||||||
.append(transMysqlFilterTerm(request.getTerm()))
|
.append(transMysqlFilterTerm(request.getTerm()))
|
||||||
.append(" ");
|
.append(" ");
|
||||||
if (StringUtils.containsIgnoreCase(request.getTerm(), "null")) {
|
if (StringUtils.equalsIgnoreCase(request.getTerm(), "null")) {
|
||||||
|
filter.append("(null,'')");
|
||||||
|
} else if (StringUtils.equalsIgnoreCase(request.getTerm(), "not_null")) {
|
||||||
|
filter.append(" AND ").append(field.getDataeaseName()).append(" <> ''");
|
||||||
} else if (StringUtils.containsIgnoreCase(request.getTerm(), "in")) {
|
} else if (StringUtils.containsIgnoreCase(request.getTerm(), "in")) {
|
||||||
filter.append("('").append(StringUtils.join(value, "','")).append("')");
|
filter.append("('").append(StringUtils.join(value, "','")).append("')");
|
||||||
} else if (StringUtils.containsIgnoreCase(request.getTerm(), "like")) {
|
} else if (StringUtils.containsIgnoreCase(request.getTerm(), "like")) {
|
||||||
|
@ -198,11 +198,14 @@ public class MysqlQueryProvider extends QueryProvider {
|
|||||||
filter.append(" AND `").append(x.getOriginName()).append("`");
|
filter.append(" AND `").append(x.getOriginName()).append("`");
|
||||||
}
|
}
|
||||||
filter.append(transMysqlFilterTerm(f.getTerm()));
|
filter.append(transMysqlFilterTerm(f.getTerm()));
|
||||||
if (StringUtils.containsIgnoreCase(f.getTerm(), "null")) {
|
if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) {
|
||||||
|
filter.append("(null,'')");
|
||||||
|
} else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) {
|
||||||
|
filter.append(" AND `").append(x.getOriginName()).append("`").append(" <> ''");
|
||||||
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) {
|
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) {
|
||||||
filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')");
|
filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')");
|
||||||
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) {
|
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) {
|
||||||
filter.append("%").append(f.getValue()).append("%");
|
filter.append("'%").append(f.getValue()).append("%'");
|
||||||
} else {
|
} else {
|
||||||
filter.append("'").append(f.getValue()).append("'");
|
filter.append("'").append(f.getValue()).append("'");
|
||||||
}
|
}
|
||||||
@ -235,11 +238,16 @@ public class MysqlQueryProvider extends QueryProvider {
|
|||||||
filter.append(" AND `_").append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()).append("`");
|
filter.append(" AND `_").append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()).append("`");
|
||||||
}
|
}
|
||||||
filter.append(transMysqlFilterTerm(f.getTerm()));
|
filter.append(transMysqlFilterTerm(f.getTerm()));
|
||||||
if (StringUtils.containsIgnoreCase(f.getTerm(), "null")) {
|
if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) {
|
||||||
|
filter.append("(null,'')");
|
||||||
|
} else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) {
|
||||||
|
filter.append(" AND `_")
|
||||||
|
.append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName())
|
||||||
|
.append("`").append(" <> ''");
|
||||||
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) {
|
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) {
|
||||||
filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')");
|
filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')");
|
||||||
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) {
|
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) {
|
||||||
filter.append("%").append(f.getValue()).append("%");
|
filter.append("'%").append(f.getValue()).append("%'");
|
||||||
} else {
|
} else {
|
||||||
filter.append("'").append(f.getValue()).append("'");
|
filter.append("'").append(f.getValue()).append("'");
|
||||||
}
|
}
|
||||||
@ -316,11 +324,16 @@ public class MysqlQueryProvider extends QueryProvider {
|
|||||||
filter.append(" AND `_").append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()).append("`");
|
filter.append(" AND `_").append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()).append("`");
|
||||||
}
|
}
|
||||||
filter.append(transMysqlFilterTerm(f.getTerm()));
|
filter.append(transMysqlFilterTerm(f.getTerm()));
|
||||||
if (StringUtils.containsIgnoreCase(f.getTerm(), "null")) {
|
if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) {
|
||||||
|
filter.append("(null,'')");
|
||||||
|
} else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) {
|
||||||
|
filter.append(" AND `_")
|
||||||
|
.append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName())
|
||||||
|
.append("`").append(" <> ''");
|
||||||
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) {
|
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) {
|
||||||
filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')");
|
filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')");
|
||||||
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) {
|
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) {
|
||||||
filter.append("%").append(f.getValue()).append("%");
|
filter.append("'%").append(f.getValue()).append("%'");
|
||||||
} else {
|
} else {
|
||||||
filter.append("'").append(f.getValue()).append("'");
|
filter.append("'").append(f.getValue()).append("'");
|
||||||
}
|
}
|
||||||
@ -355,7 +368,7 @@ public class MysqlQueryProvider extends QueryProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String createRawQuerySQL(String table, List<DatasetTableField> fields){
|
public String createRawQuerySQL(String table, List<DatasetTableField> fields) {
|
||||||
String[] array = fields.stream().map(f -> {
|
String[] array = fields.stream().map(f -> {
|
||||||
StringBuilder stringBuilder = new StringBuilder();
|
StringBuilder stringBuilder = new StringBuilder();
|
||||||
stringBuilder.append("`").append(f.getOriginName()).append("` AS ").append(f.getDataeaseName());
|
stringBuilder.append("`").append(f.getOriginName()).append("` AS ").append(f.getDataeaseName());
|
||||||
@ -392,7 +405,7 @@ public class MysqlQueryProvider extends QueryProvider {
|
|||||||
case "not like":
|
case "not like":
|
||||||
return " NOT LIKE ";
|
return " NOT LIKE ";
|
||||||
case "null":
|
case "null":
|
||||||
return " IS NULL ";
|
return " IN ";
|
||||||
case "not_null":
|
case "not_null":
|
||||||
return " IS NOT NULL ";
|
return " IS NOT NULL ";
|
||||||
case "between":
|
case "between":
|
||||||
@ -423,7 +436,10 @@ public class MysqlQueryProvider extends QueryProvider {
|
|||||||
filter.append(" ")
|
filter.append(" ")
|
||||||
.append(transMysqlFilterTerm(request.getTerm()))
|
.append(transMysqlFilterTerm(request.getTerm()))
|
||||||
.append(" ");
|
.append(" ");
|
||||||
if (StringUtils.containsIgnoreCase(request.getTerm(), "null")) {
|
if (StringUtils.equalsIgnoreCase(request.getTerm(), "null")) {
|
||||||
|
filter.append("(null,'')");
|
||||||
|
} else if (StringUtils.equalsIgnoreCase(request.getTerm(), "not_null")) {
|
||||||
|
filter.append(" AND `").append(field.getOriginName()).append("`").append(" <> ''");
|
||||||
} else if (StringUtils.containsIgnoreCase(request.getTerm(), "in")) {
|
} else if (StringUtils.containsIgnoreCase(request.getTerm(), "in")) {
|
||||||
filter.append("('").append(StringUtils.join(value, "','")).append("')");
|
filter.append("('").append(StringUtils.join(value, "','")).append("')");
|
||||||
} else if (StringUtils.containsIgnoreCase(request.getTerm(), "like")) {
|
} else if (StringUtils.containsIgnoreCase(request.getTerm(), "like")) {
|
||||||
|
@ -1,12 +1,10 @@
|
|||||||
package io.dataease.provider.oracle;
|
package io.dataease.provider.oracle;
|
||||||
|
|
||||||
import com.google.gson.Gson;
|
|
||||||
import io.dataease.base.domain.DatasetTableField;
|
import io.dataease.base.domain.DatasetTableField;
|
||||||
import io.dataease.controller.request.chart.ChartExtFilterRequest;
|
import io.dataease.controller.request.chart.ChartExtFilterRequest;
|
||||||
import io.dataease.dto.chart.ChartCustomFilterDTO;
|
import io.dataease.dto.chart.ChartCustomFilterDTO;
|
||||||
import io.dataease.dto.chart.ChartViewFieldDTO;
|
import io.dataease.dto.chart.ChartViewFieldDTO;
|
||||||
import io.dataease.provider.QueryProvider;
|
import io.dataease.provider.QueryProvider;
|
||||||
import io.swagger.models.auth.In;
|
|
||||||
import org.apache.commons.collections4.CollectionUtils;
|
import org.apache.commons.collections4.CollectionUtils;
|
||||||
import org.apache.commons.lang3.ObjectUtils;
|
import org.apache.commons.lang3.ObjectUtils;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
@ -93,9 +91,9 @@ public class OracleQueryProvider extends QueryProvider {
|
|||||||
// 如果原始类型为时间
|
// 如果原始类型为时间
|
||||||
if (f.getDeExtractType() == TIME) {
|
if (f.getDeExtractType() == TIME) {
|
||||||
if (f.getDeType() == INT || f.getDeType() == FLOAT) { //日期转数值
|
if (f.getDeType() == INT || f.getDeType() == FLOAT) { //日期转数值
|
||||||
if(f.getType().equalsIgnoreCase("DATE")){
|
if (f.getType().equalsIgnoreCase("DATE")) {
|
||||||
stringBuilder.append("TO_NUMBER( ").append(f.getOriginName()).append(" - TO_DATE('1970-01-01 8:0:0', 'YYYY-MM-DD HH24:MI:SS')) * 24 * 60 * 60 * 1000 AS ").append(f.getDataeaseName());
|
stringBuilder.append("TO_NUMBER( ").append(f.getOriginName()).append(" - TO_DATE('1970-01-01 8:0:0', 'YYYY-MM-DD HH24:MI:SS')) * 24 * 60 * 60 * 1000 AS ").append(f.getDataeaseName());
|
||||||
}else {
|
} else {
|
||||||
stringBuilder.append("TO_NUMBER(to_date(to_char( ").append(f.getOriginName()).append(" ,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss') - TO_DATE('1970-01-01 8:0:0', 'YYYY-MM-DD HH24:MI:SS')) * 24 * 60 * 60 * 1000 AS ").append(f.getDataeaseName());
|
stringBuilder.append("TO_NUMBER(to_date(to_char( ").append(f.getOriginName()).append(" ,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss') - TO_DATE('1970-01-01 8:0:0', 'YYYY-MM-DD HH24:MI:SS')) * 24 * 60 * 60 * 1000 AS ").append(f.getDataeaseName());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -123,9 +121,9 @@ public class OracleQueryProvider extends QueryProvider {
|
|||||||
return MessageFormat.format("SELECT {0} FROM {1} ", StringUtils.join(array, ","), table);
|
return MessageFormat.format("SELECT {0} FROM {1} ", StringUtils.join(array, ","), table);
|
||||||
}
|
}
|
||||||
|
|
||||||
private String sqlColumn(List<DatasetTableField> fields){
|
private String sqlColumn(List<DatasetTableField> fields) {
|
||||||
String[] array = fields.stream().map(f -> {
|
String[] array = fields.stream().map(f -> {
|
||||||
return f.getDataeaseName();
|
return f.getDataeaseName();
|
||||||
}).toArray(String[]::new);
|
}).toArray(String[]::new);
|
||||||
return StringUtils.join(array, ",");
|
return StringUtils.join(array, ",");
|
||||||
}
|
}
|
||||||
@ -184,17 +182,17 @@ public class OracleQueryProvider extends QueryProvider {
|
|||||||
// 如果原始类型为时间
|
// 如果原始类型为时间
|
||||||
if (x.getDeExtractType() == TIME) {
|
if (x.getDeExtractType() == TIME) {
|
||||||
if (x.getDeType() == INT || x.getDeType() == FLOAT) { //时间转数值
|
if (x.getDeType() == INT || x.getDeType() == FLOAT) { //时间转数值
|
||||||
if(x.getType().equalsIgnoreCase("DATE")){
|
if (x.getType().equalsIgnoreCase("DATE")) {
|
||||||
stringBuilder.append("TO_NUMBER( ").append(x.getOriginName()).append(" - TO_DATE('1970-01-01 8:0:0', 'YYYY-MM-DD HH24:MI:SS')) * 24 * 60 * 60 * 1000 AS \"_").append(x.getDataeaseName()).append("\" ");
|
stringBuilder.append("TO_NUMBER( ").append(x.getOriginName()).append(" - TO_DATE('1970-01-01 8:0:0', 'YYYY-MM-DD HH24:MI:SS')) * 24 * 60 * 60 * 1000 AS \"_").append(x.getDataeaseName()).append("\" ");
|
||||||
}else {
|
} else {
|
||||||
stringBuilder.append("TO_NUMBER(to_date(to_char( ").append(x.getOriginName()).append(" ,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss') - TO_DATE('1970-01-01 8:0:0', 'YYYY-MM-DD HH24:MI:SS')) * 24 * 60 * 60 * 1000 AS ")
|
stringBuilder.append("TO_NUMBER(to_date(to_char( ").append(x.getOriginName()).append(" ,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss') - TO_DATE('1970-01-01 8:0:0', 'YYYY-MM-DD HH24:MI:SS')) * 24 * 60 * 60 * 1000 AS ")
|
||||||
.append(x.getDataeaseName()).append("\" ");
|
.append(x.getDataeaseName()).append("\" ");
|
||||||
}
|
}
|
||||||
} else if (x.getDeType() == TIME) { //格式化显示时间
|
} else if (x.getDeType() == TIME) { //格式化显示时间
|
||||||
String format = transDateFormat(x.getDateStyle(), x.getDatePattern());
|
String format = transDateFormat(x.getDateStyle(), x.getDatePattern());
|
||||||
if(x.getType().equalsIgnoreCase("DATE")){
|
if (x.getType().equalsIgnoreCase("DATE")) {
|
||||||
stringBuilder.append("to_char( ").append(x.getOriginName()).append(" ,'").append(format).append("') AS \"_").append(x.getOriginName()).append("\" ");
|
stringBuilder.append("to_char( ").append(x.getOriginName()).append(" ,'").append(format).append("') AS \"_").append(x.getOriginName()).append("\" ");
|
||||||
}else {
|
} else {
|
||||||
stringBuilder.append("to_char(to_date(to_char( ").append(x.getOriginName()).append(" ,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss'), '").append(format).append("') AS \"_").append(x.getOriginName()).append("\" ");
|
stringBuilder.append("to_char(to_date(to_char( ").append(x.getOriginName()).append(" ,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss'), '").append(format).append("') AS \"_").append(x.getOriginName()).append("\" ");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -206,7 +204,7 @@ public class OracleQueryProvider extends QueryProvider {
|
|||||||
if (x.getDeExtractType() == STRING) { //字符串转时间
|
if (x.getDeExtractType() == STRING) { //字符串转时间
|
||||||
stringBuilder.append("to_char(to_date(").append(x.getOriginName()).append(" , 'yyyy-MM-dd hh24:mi:ss'), '").append(format).append("') AS \"_").append(x.getOriginName()).append("\" ");
|
stringBuilder.append("to_char(to_date(").append(x.getOriginName()).append(" , 'yyyy-MM-dd hh24:mi:ss'), '").append(format).append("') AS \"_").append(x.getOriginName()).append("\" ");
|
||||||
} else { //数值转时间
|
} else { //数值转时间
|
||||||
stringBuilder.append("to_char(").append(x.getOriginName()) .append("/ (1000 * 60 * 60 * 24) + TO_DATE('1970-01-01 08:00:00', 'YYYY-MM-DD HH24:MI:SS'), '").append(format).append("') AS \"_").append(x.getOriginName()).append("\" ");
|
stringBuilder.append("to_char(").append(x.getOriginName()).append("/ (1000 * 60 * 60 * 24) + TO_DATE('1970-01-01 08:00:00', 'YYYY-MM-DD HH24:MI:SS'), '").append(format).append("') AS \"_").append(x.getOriginName()).append("\" ");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
stringBuilder.append(" ").append(x.getOriginName()).append(" AS \"_").append(x.getOriginName()).append("\" ");
|
stringBuilder.append(" ").append(x.getOriginName()).append(" AS \"_").append(x.getOriginName()).append("\" ");
|
||||||
@ -234,11 +232,14 @@ public class OracleQueryProvider extends QueryProvider {
|
|||||||
filter.append(" AND ").append(x.getOriginName()).append(" ");
|
filter.append(" AND ").append(x.getOriginName()).append(" ");
|
||||||
}
|
}
|
||||||
filter.append(transMysqlFilterTerm(f.getTerm()));
|
filter.append(transMysqlFilterTerm(f.getTerm()));
|
||||||
if (StringUtils.containsIgnoreCase(f.getTerm(), "null")) {
|
if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) {
|
||||||
|
filter.append("(null,'')");
|
||||||
|
} else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) {
|
||||||
|
filter.append(" AND ").append(x.getOriginName()).append(" <> ''");
|
||||||
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) {
|
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) {
|
||||||
filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')");
|
filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')");
|
||||||
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) {
|
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) {
|
||||||
filter.append("%").append(f.getValue()).append("%");
|
filter.append("'%").append(f.getValue()).append("%'");
|
||||||
} else {
|
} else {
|
||||||
filter.append("'").append(f.getValue()).append("'");
|
filter.append("'").append(f.getValue()).append("'");
|
||||||
}
|
}
|
||||||
@ -271,11 +272,16 @@ public class OracleQueryProvider extends QueryProvider {
|
|||||||
filter.append(" AND _").append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()).append(" ");
|
filter.append(" AND _").append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()).append(" ");
|
||||||
}
|
}
|
||||||
filter.append(transMysqlFilterTerm(f.getTerm()));
|
filter.append(transMysqlFilterTerm(f.getTerm()));
|
||||||
if (StringUtils.containsIgnoreCase(f.getTerm(), "null")) {
|
if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) {
|
||||||
|
filter.append("(null,'')");
|
||||||
|
} else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) {
|
||||||
|
filter.append(" AND _")
|
||||||
|
.append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName())
|
||||||
|
.append(" <> ''");
|
||||||
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) {
|
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) {
|
||||||
filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')");
|
filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')");
|
||||||
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) {
|
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) {
|
||||||
filter.append("%").append(f.getValue()).append("%");
|
filter.append("'%").append(f.getValue()).append("%'");
|
||||||
} else {
|
} else {
|
||||||
filter.append("'").append(f.getValue()).append("'");
|
filter.append("'").append(f.getValue()).append("'");
|
||||||
}
|
}
|
||||||
@ -352,11 +358,16 @@ public class OracleQueryProvider extends QueryProvider {
|
|||||||
filter.append(" AND _").append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()).append(" ");
|
filter.append(" AND _").append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()).append(" ");
|
||||||
}
|
}
|
||||||
filter.append(transMysqlFilterTerm(f.getTerm()));
|
filter.append(transMysqlFilterTerm(f.getTerm()));
|
||||||
if (StringUtils.containsIgnoreCase(f.getTerm(), "null")) {
|
if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) {
|
||||||
|
filter.append("(null,'')");
|
||||||
|
} else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) {
|
||||||
|
filter.append(" AND _")
|
||||||
|
.append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()).append(" ")
|
||||||
|
.append(" <> ''");
|
||||||
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) {
|
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) {
|
||||||
filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')");
|
filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')");
|
||||||
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) {
|
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) {
|
||||||
filter.append("%").append(f.getValue()).append("%");
|
filter.append("'%").append(f.getValue()).append("%'");
|
||||||
} else {
|
} else {
|
||||||
filter.append("'").append(f.getValue()).append("'");
|
filter.append("'").append(f.getValue()).append("'");
|
||||||
}
|
}
|
||||||
@ -391,7 +402,7 @@ public class OracleQueryProvider extends QueryProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String createRawQuerySQL(String table, List<DatasetTableField> fields){
|
public String createRawQuerySQL(String table, List<DatasetTableField> fields) {
|
||||||
String[] array = fields.stream().map(f -> {
|
String[] array = fields.stream().map(f -> {
|
||||||
StringBuilder stringBuilder = new StringBuilder();
|
StringBuilder stringBuilder = new StringBuilder();
|
||||||
stringBuilder.append(" ").append(f.getOriginName()).append(" AS ").append(f.getDataeaseName());
|
stringBuilder.append(" ").append(f.getOriginName()).append(" AS ").append(f.getDataeaseName());
|
||||||
@ -428,7 +439,7 @@ public class OracleQueryProvider extends QueryProvider {
|
|||||||
case "not like":
|
case "not like":
|
||||||
return " NOT LIKE ";
|
return " NOT LIKE ";
|
||||||
case "null":
|
case "null":
|
||||||
return " IS NULL ";
|
return " IN ";
|
||||||
case "not_null":
|
case "not_null":
|
||||||
return " IS NOT NULL ";
|
return " IS NOT NULL ";
|
||||||
case "between":
|
case "between":
|
||||||
@ -459,7 +470,10 @@ public class OracleQueryProvider extends QueryProvider {
|
|||||||
filter.append(" ")
|
filter.append(" ")
|
||||||
.append(transMysqlFilterTerm(request.getTerm()))
|
.append(transMysqlFilterTerm(request.getTerm()))
|
||||||
.append(" ");
|
.append(" ");
|
||||||
if (StringUtils.containsIgnoreCase(request.getTerm(), "null")) {
|
if (StringUtils.equalsIgnoreCase(request.getTerm(), "null")) {
|
||||||
|
filter.append("(null,'')");
|
||||||
|
} else if (StringUtils.equalsIgnoreCase(request.getTerm(), "not_null")) {
|
||||||
|
filter.append(" AND `").append(field.getOriginName()).append("`").append(" <> ''");
|
||||||
} else if (StringUtils.containsIgnoreCase(request.getTerm(), "in")) {
|
} else if (StringUtils.containsIgnoreCase(request.getTerm(), "in")) {
|
||||||
filter.append("('").append(StringUtils.join(value, "','")).append("')");
|
filter.append("('").append(StringUtils.join(value, "','")).append("')");
|
||||||
} else if (StringUtils.containsIgnoreCase(request.getTerm(), "like")) {
|
} else if (StringUtils.containsIgnoreCase(request.getTerm(), "like")) {
|
||||||
|
@ -6,31 +6,31 @@ import io.dataease.dto.chart.ChartCustomFilterDTO;
|
|||||||
import io.dataease.dto.chart.ChartViewFieldDTO;
|
import io.dataease.dto.chart.ChartViewFieldDTO;
|
||||||
import io.dataease.provider.QueryProvider;
|
import io.dataease.provider.QueryProvider;
|
||||||
import org.apache.commons.collections4.CollectionUtils;
|
import org.apache.commons.collections4.CollectionUtils;
|
||||||
|
import org.apache.commons.lang3.ObjectUtils;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import java.text.MessageFormat;
|
import java.text.MessageFormat;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Author gin
|
* @Author gin
|
||||||
* @Date 2021/5/17 2:43 下午
|
* @Date 2021/5/17 2:43 下午
|
||||||
*/
|
*/
|
||||||
@Service("sqlserverQuery")
|
@Service("sqlServerQuery")
|
||||||
public class SqlserverQueryProvider extends QueryProvider {
|
public class SqlserverQueryProvider extends QueryProvider {
|
||||||
@Override
|
@Override
|
||||||
public Integer transFieldType(String field) {
|
public Integer transFieldType(String field) {
|
||||||
switch (field.toUpperCase()) {
|
switch (field) {
|
||||||
case "CHAR":
|
case "CHAR":
|
||||||
case "VARCHAR":
|
case "VARCHAR":
|
||||||
case "TEXT":
|
case "TEXT":
|
||||||
case "TINYTEXT":
|
case "TINYTEXT":
|
||||||
case "MEDIUMTEXT":
|
case "MEDIUMTEXT":
|
||||||
case "LONGTEXT":
|
case "LONGTEXT":
|
||||||
case "NCHAR":
|
|
||||||
case "NVARCHAR":
|
|
||||||
case "NTEXT":
|
|
||||||
case "ENUM":
|
case "ENUM":
|
||||||
return 0;// 文本
|
return 0;// 文本
|
||||||
case "DATE":
|
case "DATE":
|
||||||
@ -59,7 +59,7 @@ public class SqlserverQueryProvider extends QueryProvider {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String createQueryCountSQL(String table) {
|
public String createQueryCountSQL(String table) {
|
||||||
return MessageFormat.format("SELECT count(*) FROM {0}", table);
|
return MessageFormat.format("SELECT COUNT(*) FROM {0}", table);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -69,7 +69,7 @@ public class SqlserverQueryProvider extends QueryProvider {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String createSQLPreview(String sql, String orderBy) {
|
public String createSQLPreview(String sql, String orderBy) {
|
||||||
return "SELECT * FROM (" + sqlFix(sql) + ") AS tmp ORDER BY " + orderBy + " LIMIT 0,1000";
|
return "SELECT * FROM (" + sqlFix(sql) + ") AS tmp ORDER BY null " + " LIMIT 0,1000";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -79,21 +79,30 @@ public class SqlserverQueryProvider extends QueryProvider {
|
|||||||
// 如果原始类型为时间
|
// 如果原始类型为时间
|
||||||
if (f.getDeExtractType() == 1) {
|
if (f.getDeExtractType() == 1) {
|
||||||
if (f.getDeType() == 2 || f.getDeType() == 3) {
|
if (f.getDeType() == 2 || f.getDeType() == 3) {
|
||||||
stringBuilder.append("unix_timestamp(").append(f.getOriginName()).append(")*1000 as ").append(f.getOriginName());
|
stringBuilder.append("UNIX_TIMESTAMP(`").append(f.getOriginName()).append("`)*1000 AS ").append(f.getDataeaseName());
|
||||||
} else {
|
} else {
|
||||||
stringBuilder.append(f.getOriginName());
|
stringBuilder.append("`").append(f.getOriginName()).append("` AS ").append(f.getDataeaseName());
|
||||||
|
}
|
||||||
|
} else if (f.getDeExtractType() == 0) {
|
||||||
|
if (f.getDeType() == 2) {
|
||||||
|
stringBuilder.append("CAST(`").append(f.getOriginName()).append("` AS DECIMAL(20,0)) AS ").append(f.getDataeaseName());
|
||||||
|
} else if (f.getDeType() == 3) {
|
||||||
|
stringBuilder.append("CAST(`").append(f.getOriginName()).append("` AS DECIMAL(20,2)) AS ").append(f.getDataeaseName());
|
||||||
|
} else if (f.getDeType() == 1) {
|
||||||
|
stringBuilder.append("DATE_FORMAT(`").append(f.getOriginName()).append("`,'%Y-%m-%d %H:%i:%S') AS _").append(f.getDataeaseName());
|
||||||
|
} else {
|
||||||
|
stringBuilder.append("`").append(f.getOriginName()).append("` AS ").append(f.getDataeaseName());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (f.getDeType() == 1) {
|
if (f.getDeType() == 1) {
|
||||||
stringBuilder.append("FROM_UNIXTIME(cast(").append(f.getOriginName()).append(" as decimal(20,0))/1000,'%Y-%m-%d %H:%i:%S') as ").append(f.getOriginName());
|
stringBuilder.append("FROM_UNIXTIME(CAST(`").append(f.getOriginName()).append("` AS DECIMAL(20,0))/1000,'%Y-%m-%d %H:%i:%S') AS ").append(f.getDataeaseName());
|
||||||
} else {
|
} else {
|
||||||
stringBuilder.append(f.getOriginName());
|
stringBuilder.append("`").append(f.getOriginName()).append("` AS ").append(f.getDataeaseName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return stringBuilder.toString();
|
return stringBuilder.toString();
|
||||||
}).toArray(String[]::new);
|
}).toArray(String[]::new);
|
||||||
|
return MessageFormat.format("SELECT {0} FROM {1} ORDER BY null", StringUtils.join(array, ","), table);
|
||||||
return MessageFormat.format("SELECT {0} FROM {1} ORDER BY " + (fields.size() > 0 ? fields.get(0).getOriginName() : "null"), StringUtils.join(array, ","), table);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -103,7 +112,7 @@ public class SqlserverQueryProvider extends QueryProvider {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String createQuerySQLWithPage(String table, List<DatasetTableField> fields, Integer page, Integer pageSize, Integer realSize) {
|
public String createQuerySQLWithPage(String table, List<DatasetTableField> fields, Integer page, Integer pageSize, Integer realSize) {
|
||||||
return createQuerySQL(table, fields) + " offset " + (page - 1) * pageSize + " rows fetch next " + realSize + " rows only";
|
return createQuerySQL(table, fields) + " LIMIT " + (page - 1) * pageSize + "," + realSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -132,15 +141,15 @@ public class SqlserverQueryProvider extends QueryProvider {
|
|||||||
if (StringUtils.equalsIgnoreCase(y.getSummary(), "avg") || StringUtils.containsIgnoreCase(y.getSummary(), "pop")) {
|
if (StringUtils.equalsIgnoreCase(y.getSummary(), "avg") || StringUtils.containsIgnoreCase(y.getSummary(), "pop")) {
|
||||||
f.append("CAST(")
|
f.append("CAST(")
|
||||||
.append(y.getSummary()).append("(")
|
.append(y.getSummary()).append("(")
|
||||||
.append("CAST(").append(y.getOriginName()).append(" AS ").append(y.getDeType() == 2 ? "DECIMAL(20,0)" : "DECIMAL(20,2)").append(")")
|
.append("CAST(`").append(y.getOriginName()).append("` AS ").append(y.getDeType() == 2 ? "DECIMAL(20,0)" : "DECIMAL(20,2)").append(")")
|
||||||
.append(") AS DECIMAL(20,2)").append(")");
|
.append(") AS DECIMAL(20,2)").append(")");
|
||||||
} else {
|
} else {
|
||||||
f.append(y.getSummary()).append("(")
|
f.append(y.getSummary()).append("(")
|
||||||
.append("CAST(").append(y.getOriginName()).append(" AS ").append(y.getDeType() == 2 ? "DECIMAL(20,0)" : "DECIMAL(20,2)").append(")")
|
.append("CAST(`").append(y.getOriginName()).append("` AS ").append(y.getDeType() == 2 ? "DECIMAL(20,0)" : "DECIMAL(20,2)").append(")")
|
||||||
.append(")");
|
.append(")");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
f.append(" AS _").append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName());
|
f.append(" AS `_").append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()).append("`");
|
||||||
return f.toString();
|
return f.toString();
|
||||||
}).toArray(String[]::new);
|
}).toArray(String[]::new);
|
||||||
String[] groupField = xAxis.stream().map(x -> {
|
String[] groupField = xAxis.stream().map(x -> {
|
||||||
@ -148,24 +157,32 @@ public class SqlserverQueryProvider extends QueryProvider {
|
|||||||
// 如果原始类型为时间
|
// 如果原始类型为时间
|
||||||
if (x.getDeExtractType() == 1) {
|
if (x.getDeExtractType() == 1) {
|
||||||
if (x.getDeType() == 2 || x.getDeType() == 3) {
|
if (x.getDeType() == 2 || x.getDeType() == 3) {
|
||||||
stringBuilder.append("unix_timestamp(").append(x.getOriginName()).append(")*1000 as ").append(x.getOriginName());
|
stringBuilder.append("UNIX_TIMESTAMP(`").append(x.getOriginName()).append("`)*1000 AS `_").append(x.getOriginName()).append("`");
|
||||||
|
} else if (x.getDeType() == 1) {
|
||||||
|
String format = transDateFormat(x.getDateStyle(), x.getDatePattern());
|
||||||
|
stringBuilder.append("DATE_FORMAT(`").append(x.getOriginName()).append("`,'").append(format).append("') AS `_").append(x.getOriginName()).append("`");
|
||||||
} else {
|
} else {
|
||||||
stringBuilder.append(x.getOriginName());
|
stringBuilder.append("`").append(x.getOriginName()).append("` AS `_").append(x.getOriginName()).append("`");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (x.getDeType() == 1) {
|
if (x.getDeType() == 1) {
|
||||||
stringBuilder.append("FROM_UNIXTIME(cast(").append(x.getOriginName()).append(" as decimal(20,0))/1000,'%Y-%m-%d %H:%i:%S') as ").append(x.getOriginName());
|
String format = transDateFormat(x.getDateStyle(), x.getDatePattern());
|
||||||
|
if (x.getDeExtractType() == 0) {
|
||||||
|
stringBuilder.append("DATE_FORMAT(`").append(x.getOriginName()).append("`,'").append(format).append("') AS `_").append(x.getOriginName()).append("`");
|
||||||
|
} else {
|
||||||
|
stringBuilder.append("DATE_FORMAT(").append("FROM_UNIXTIME(CAST(`").append(x.getOriginName()).append("` AS DECIMAL(20,0))/1000,'%Y-%m-%d %H:%i:%S')").append(",'").append(format).append("') AS `_").append(x.getOriginName()).append("`");
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
stringBuilder.append(x.getOriginName());
|
stringBuilder.append("`").append(x.getOriginName()).append("` AS `_").append(x.getOriginName()).append("`");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return stringBuilder.toString();
|
return stringBuilder.toString();
|
||||||
}).toArray(String[]::new);
|
}).toArray(String[]::new);
|
||||||
String[] group = xAxis.stream().map(ChartViewFieldDTO::getOriginName).toArray(String[]::new);
|
String[] group = xAxis.stream().map(x -> "`_" + x.getOriginName() + "`").toArray(String[]::new);
|
||||||
String[] xOrder = xAxis.stream().filter(f -> StringUtils.isNotEmpty(f.getSort()) && !StringUtils.equalsIgnoreCase(f.getSort(), "none"))
|
String[] xOrder = xAxis.stream().filter(f -> StringUtils.isNotEmpty(f.getSort()) && !StringUtils.equalsIgnoreCase(f.getSort(), "none"))
|
||||||
.map(f -> f.getOriginName() + " " + f.getSort()).toArray(String[]::new);
|
.map(f -> "`_" + f.getOriginName() + "` " + f.getSort()).toArray(String[]::new);
|
||||||
String[] yOrder = yAxis.stream().filter(f -> StringUtils.isNotEmpty(f.getSort()) && !StringUtils.equalsIgnoreCase(f.getSort(), "none"))
|
String[] yOrder = yAxis.stream().filter(f -> StringUtils.isNotEmpty(f.getSort()) && !StringUtils.equalsIgnoreCase(f.getSort(), "none"))
|
||||||
.map(f -> "_" + f.getSummary() + "_" + (StringUtils.equalsIgnoreCase(f.getOriginName(), "*") ? "" : f.getOriginName()) + " " + f.getSort()).toArray(String[]::new);
|
.map(f -> "`_" + f.getSummary() + "_" + (StringUtils.equalsIgnoreCase(f.getOriginName(), "*") ? "" : f.getOriginName()) + "` " + f.getSort()).toArray(String[]::new);
|
||||||
String[] order = Arrays.copyOf(xOrder, xOrder.length + yOrder.length);
|
String[] order = Arrays.copyOf(xOrder, xOrder.length + yOrder.length);
|
||||||
System.arraycopy(yOrder, 0, order, xOrder.length, yOrder.length);
|
System.arraycopy(yOrder, 0, order, xOrder.length, yOrder.length);
|
||||||
|
|
||||||
@ -174,14 +191,17 @@ public class SqlserverQueryProvider extends QueryProvider {
|
|||||||
String[] s = x.getFilter().stream().map(f -> {
|
String[] s = x.getFilter().stream().map(f -> {
|
||||||
StringBuilder filter = new StringBuilder();
|
StringBuilder filter = new StringBuilder();
|
||||||
if (x.getDeType() == 1 && x.getDeExtractType() != 1) {
|
if (x.getDeType() == 1 && x.getDeExtractType() != 1) {
|
||||||
filter.append(" AND FROM_UNIXTIME(cast(")
|
filter.append(" AND FROM_UNIXTIME(cast(`")
|
||||||
.append(x.getOriginName())
|
.append(x.getOriginName())
|
||||||
.append(" AS decimal(20,0))/1000,'%Y-%m-%d %H:%i:%S') ");
|
.append("` AS DECIMAL(20,0))/1000,'%Y-%m-%d %H:%i:%S') ");
|
||||||
} else {
|
} else {
|
||||||
filter.append(" AND ").append(x.getOriginName());
|
filter.append(" AND `").append(x.getOriginName()).append("`");
|
||||||
}
|
}
|
||||||
filter.append(transMysqlFilterTerm(f.getTerm()));
|
filter.append(transMysqlFilterTerm(f.getTerm()));
|
||||||
if (StringUtils.containsIgnoreCase(f.getTerm(), "null")) {
|
if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) {
|
||||||
|
filter.append("(null,'')");
|
||||||
|
} else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) {
|
||||||
|
filter.append(" AND `").append(x.getOriginName()).append("`").append(" <> ''");
|
||||||
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) {
|
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) {
|
||||||
filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')");
|
filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')");
|
||||||
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) {
|
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) {
|
||||||
@ -211,14 +231,19 @@ public class SqlserverQueryProvider extends QueryProvider {
|
|||||||
StringBuilder filter = new StringBuilder();
|
StringBuilder filter = new StringBuilder();
|
||||||
// 原始类型不是时间,在de中被转成时间的字段做处理
|
// 原始类型不是时间,在de中被转成时间的字段做处理
|
||||||
if (y.getDeType() == 1 && y.getDeExtractType() != 1) {
|
if (y.getDeType() == 1 && y.getDeExtractType() != 1) {
|
||||||
filter.append(" AND FROM_UNIXTIME(cast(_")
|
filter.append(" AND FROM_UNIXTIME(CAST(`_")
|
||||||
.append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName())
|
.append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()).append("`")
|
||||||
.append(" AS decimal(20,0))/1000,'%Y-%m-%d %H:%i:%S') ");
|
.append(" AS DECIMAL(20,0))/1000,'%Y-%m-%d %H:%i:%S') ");
|
||||||
} else {
|
} else {
|
||||||
filter.append(" AND _").append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName());
|
filter.append(" AND `_").append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()).append("`");
|
||||||
}
|
}
|
||||||
filter.append(transMysqlFilterTerm(f.getTerm()));
|
filter.append(transMysqlFilterTerm(f.getTerm()));
|
||||||
if (StringUtils.containsIgnoreCase(f.getTerm(), "null")) {
|
if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) {
|
||||||
|
filter.append("(null,'')");
|
||||||
|
} else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) {
|
||||||
|
filter.append(" AND `_")
|
||||||
|
.append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName())
|
||||||
|
.append("`").append(" <> ''");
|
||||||
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) {
|
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) {
|
||||||
filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')");
|
filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')");
|
||||||
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) {
|
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) {
|
||||||
@ -233,9 +258,10 @@ public class SqlserverQueryProvider extends QueryProvider {
|
|||||||
if (resultFilter.length == 0) {
|
if (resultFilter.length == 0) {
|
||||||
return sql;
|
return sql;
|
||||||
} else {
|
} else {
|
||||||
String filterSql = MessageFormat.format("SELECT * FROM {0} WHERE 1=1 {1}",
|
String filterSql = MessageFormat.format("SELECT * FROM {0} WHERE 1=1 {1} ORDER BY {2}",
|
||||||
"(" + sql + ") AS tmp",
|
"(" + sql + ") AS tmp",
|
||||||
StringUtils.join(resultFilter, " "));
|
StringUtils.join(resultFilter, " "),
|
||||||
|
ObjectUtils.isNotEmpty(yOrder) ? StringUtils.join(yOrder, ",") : "null");
|
||||||
return filterSql;
|
return filterSql;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -252,12 +278,83 @@ public class SqlserverQueryProvider extends QueryProvider {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getSQLSummary(String table, List<ChartViewFieldDTO> yAxis, List<ChartCustomFilterDTO> customFilter, List<ChartExtFilterRequest> extFilterRequestList) {
|
public String getSQLSummary(String table, List<ChartViewFieldDTO> yAxis, List<ChartCustomFilterDTO> customFilter, List<ChartExtFilterRequest> extFilterRequestList) {
|
||||||
return null;
|
// 字段汇总 排序等
|
||||||
|
String[] field = yAxis.stream().map(y -> {
|
||||||
|
StringBuilder f = new StringBuilder();
|
||||||
|
if (StringUtils.equalsIgnoreCase(y.getOriginName(), "*")) {
|
||||||
|
f.append(y.getSummary()).append("(").append(y.getOriginName()).append(")");
|
||||||
|
} else {
|
||||||
|
if (StringUtils.equalsIgnoreCase(y.getSummary(), "avg") || StringUtils.containsIgnoreCase(y.getSummary(), "pop")) {
|
||||||
|
f.append("CAST(")
|
||||||
|
.append(y.getSummary()).append("(")
|
||||||
|
.append("CAST(`").append(y.getOriginName()).append("` AS ").append(y.getDeType() == 2 ? "DECIMAL(20,0)" : "DECIMAL(20,2)").append(")")
|
||||||
|
.append(") AS DECIMAL(20,2)").append(")");
|
||||||
|
} else {
|
||||||
|
f.append(y.getSummary()).append("(")
|
||||||
|
.append("CAST(`").append(y.getOriginName()).append("` AS ").append(y.getDeType() == 2 ? "DECIMAL(20,0)" : "DECIMAL(20,2)").append(")")
|
||||||
|
.append(")");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f.append(" AS `_").append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()).append("`");
|
||||||
|
return f.toString();
|
||||||
|
}).toArray(String[]::new);
|
||||||
|
|
||||||
|
String[] order = yAxis.stream().filter(f -> StringUtils.isNotEmpty(f.getSort()) && !StringUtils.equalsIgnoreCase(f.getSort(), "none"))
|
||||||
|
.map(f -> "`_" + f.getSummary() + "_" + (StringUtils.equalsIgnoreCase(f.getOriginName(), "*") ? "" : f.getOriginName()) + "` " + f.getSort()).toArray(String[]::new);
|
||||||
|
|
||||||
|
String sql = MessageFormat.format("SELECT {0} FROM {1} WHERE 1=1 {2} ORDER BY null,{3}",
|
||||||
|
StringUtils.join(field, ","),
|
||||||
|
table,
|
||||||
|
transCustomFilter(customFilter) + transExtFilter(extFilterRequestList),// origin field filter and panel field filter
|
||||||
|
StringUtils.join(order, ","));
|
||||||
|
if (sql.endsWith(",")) {
|
||||||
|
sql = sql.substring(0, sql.length() - 1);
|
||||||
|
}
|
||||||
|
// 如果是对结果字段过滤,则再包裹一层sql
|
||||||
|
String[] resultFilter = yAxis.stream().filter(y -> CollectionUtils.isNotEmpty(y.getFilter()) && y.getFilter().size() > 0)
|
||||||
|
.map(y -> {
|
||||||
|
String[] s = y.getFilter().stream().map(f -> {
|
||||||
|
StringBuilder filter = new StringBuilder();
|
||||||
|
// 原始类型不是时间,在de中被转成时间的字段做处理
|
||||||
|
if (y.getDeType() == 1 && y.getDeExtractType() != 1) {
|
||||||
|
filter.append(" AND FROM_UNIXTIME(CAST(`_")
|
||||||
|
.append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()).append("`")
|
||||||
|
.append(" AS DECIMAL(20,0))/1000,'%Y-%m-%d %H:%i:%S') ");
|
||||||
|
} else {
|
||||||
|
filter.append(" AND `_").append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()).append("`");
|
||||||
|
}
|
||||||
|
filter.append(transMysqlFilterTerm(f.getTerm()));
|
||||||
|
if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) {
|
||||||
|
filter.append("(null,'')");
|
||||||
|
} else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) {
|
||||||
|
filter.append(" AND `_")
|
||||||
|
.append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName())
|
||||||
|
.append("`").append(" <> ''");
|
||||||
|
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) {
|
||||||
|
filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')");
|
||||||
|
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) {
|
||||||
|
filter.append("%").append(f.getValue()).append("%");
|
||||||
|
} else {
|
||||||
|
filter.append("'").append(f.getValue()).append("'");
|
||||||
|
}
|
||||||
|
return filter.toString();
|
||||||
|
}).toArray(String[]::new);
|
||||||
|
return StringUtils.join(s, " ");
|
||||||
|
}).toArray(String[]::new);
|
||||||
|
if (resultFilter.length == 0) {
|
||||||
|
return sql;
|
||||||
|
} else {
|
||||||
|
String filterSql = MessageFormat.format("SELECT * FROM {0} WHERE 1=1 {1} ORDER BY {2}",
|
||||||
|
"(" + sql + ") AS tmp",
|
||||||
|
StringUtils.join(resultFilter, " "),
|
||||||
|
ObjectUtils.isNotEmpty(order) ? StringUtils.join(order, ",") : "null");
|
||||||
|
return filterSql;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getSQLSummaryAsTmp(String table, List<ChartViewFieldDTO> yAxis, List<ChartCustomFilterDTO> customFilter, List<ChartExtFilterRequest> extFilterRequestList) {
|
public String getSQLSummaryAsTmp(String sql, List<ChartViewFieldDTO> yAxis, List<ChartCustomFilterDTO> customFilter, List<ChartExtFilterRequest> extFilterRequestList) {
|
||||||
return null;
|
return getSQLSummary(" (" + sqlFix(sql) + ") AS tmp ", yAxis, customFilter, extFilterRequestList);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -271,7 +368,7 @@ public class SqlserverQueryProvider extends QueryProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String createRawQuerySQL(String table, List<DatasetTableField> fields){
|
public String createRawQuerySQL(String table, List<DatasetTableField> fields) {
|
||||||
String[] array = fields.stream().map(f -> {
|
String[] array = fields.stream().map(f -> {
|
||||||
StringBuilder stringBuilder = new StringBuilder();
|
StringBuilder stringBuilder = new StringBuilder();
|
||||||
stringBuilder.append("`").append(f.getOriginName()).append("` AS ").append(f.getDataeaseName());
|
stringBuilder.append("`").append(f.getOriginName()).append("` AS ").append(f.getDataeaseName());
|
||||||
@ -308,9 +405,11 @@ public class SqlserverQueryProvider extends QueryProvider {
|
|||||||
case "not like":
|
case "not like":
|
||||||
return " NOT LIKE ";
|
return " NOT LIKE ";
|
||||||
case "null":
|
case "null":
|
||||||
return " IS NULL ";
|
return " IN ";
|
||||||
case "not_null":
|
case "not_null":
|
||||||
return " IS NOT NULL ";
|
return " IS NOT NULL ";
|
||||||
|
case "between":
|
||||||
|
return " BETWEEN ";
|
||||||
default:
|
default:
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
@ -324,17 +423,24 @@ public class SqlserverQueryProvider extends QueryProvider {
|
|||||||
for (ChartCustomFilterDTO request : requestList) {
|
for (ChartCustomFilterDTO request : requestList) {
|
||||||
String value = request.getValue();
|
String value = request.getValue();
|
||||||
DatasetTableField field = request.getField();
|
DatasetTableField field = request.getField();
|
||||||
|
if (ObjectUtils.isEmpty(field)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (field.getDeType() == 1 && field.getDeExtractType() != 1) {
|
if (field.getDeType() == 1 && field.getDeExtractType() != 1) {
|
||||||
filter.append(" AND FROM_UNIXTIME(cast(")
|
filter.append(" AND FROM_UNIXTIME(CAST(`")
|
||||||
.append(field.getOriginName())
|
.append(field.getOriginName())
|
||||||
.append(" AS decimal(20,0))/1000,'%Y-%m-%d %H:%i:%S') ");
|
.append("` AS DECIMAL(20,0))/1000,'%Y-%m-%d %H:%i:%S') ");
|
||||||
} else {
|
} else {
|
||||||
filter.append(" AND ").append(field.getOriginName());
|
filter.append(" AND `").append(field.getOriginName()).append("`");
|
||||||
}
|
}
|
||||||
filter.append(" ")
|
filter.append(" ")
|
||||||
.append(transMysqlFilterTerm(request.getTerm()))
|
.append(transMysqlFilterTerm(request.getTerm()))
|
||||||
.append(" ");
|
.append(" ");
|
||||||
if (StringUtils.containsIgnoreCase(request.getTerm(), "in")) {
|
if (StringUtils.equalsIgnoreCase(request.getTerm(), "null")) {
|
||||||
|
filter.append("(null,'')");
|
||||||
|
} else if (StringUtils.equalsIgnoreCase(request.getTerm(), "not_null")) {
|
||||||
|
filter.append(" AND `").append(field.getOriginName()).append("`").append(" <> ''");
|
||||||
|
} else if (StringUtils.containsIgnoreCase(request.getTerm(), "in")) {
|
||||||
filter.append("('").append(StringUtils.join(value, "','")).append("')");
|
filter.append("('").append(StringUtils.join(value, "','")).append("')");
|
||||||
} else if (StringUtils.containsIgnoreCase(request.getTerm(), "like")) {
|
} else if (StringUtils.containsIgnoreCase(request.getTerm(), "like")) {
|
||||||
filter.append("'%").append(value).append("%'");
|
filter.append("'%").append(value).append("%'");
|
||||||
@ -357,11 +463,11 @@ public class SqlserverQueryProvider extends QueryProvider {
|
|||||||
}
|
}
|
||||||
DatasetTableField field = request.getDatasetTableField();
|
DatasetTableField field = request.getDatasetTableField();
|
||||||
if (field.getDeType() == 1 && field.getDeExtractType() != 1) {
|
if (field.getDeType() == 1 && field.getDeExtractType() != 1) {
|
||||||
filter.append(" AND FROM_UNIXTIME(cast(")
|
filter.append(" AND FROM_UNIXTIME(CAST(`")
|
||||||
.append(field.getOriginName())
|
.append(field.getOriginName())
|
||||||
.append(" AS decimal(20,0))/1000,'%Y-%m-%d %H:%i:%S') ");
|
.append("` AS DECIMAL(20,0))/1000,'%Y-%m-%d %H:%i:%S') ");
|
||||||
} else {
|
} else {
|
||||||
filter.append(" AND ").append(field.getOriginName());
|
filter.append(" AND `").append(field.getOriginName()).append("`");
|
||||||
}
|
}
|
||||||
filter.append(" ")
|
filter.append(" ")
|
||||||
.append(transMysqlFilterTerm(request.getOperator()))
|
.append(transMysqlFilterTerm(request.getOperator()))
|
||||||
@ -370,6 +476,11 @@ public class SqlserverQueryProvider extends QueryProvider {
|
|||||||
filter.append("('").append(StringUtils.join(value, "','")).append("')");
|
filter.append("('").append(StringUtils.join(value, "','")).append("')");
|
||||||
} else if (StringUtils.containsIgnoreCase(request.getOperator(), "like")) {
|
} else if (StringUtils.containsIgnoreCase(request.getOperator(), "like")) {
|
||||||
filter.append("'%").append(value.get(0)).append("%'");
|
filter.append("'%").append(value.get(0)).append("%'");
|
||||||
|
} else if (StringUtils.containsIgnoreCase(request.getOperator(), "between")) {
|
||||||
|
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
||||||
|
String startTime = simpleDateFormat.format(new Date(Long.parseLong(value.get(0))));
|
||||||
|
String endTime = simpleDateFormat.format(new Date(Long.parseLong(value.get(1))));
|
||||||
|
filter.append("'").append(startTime).append("' AND '").append(endTime).append("'");
|
||||||
} else {
|
} else {
|
||||||
filter.append("'").append(value.get(0)).append("'");
|
filter.append("'").append(value.get(0)).append("'");
|
||||||
}
|
}
|
||||||
@ -383,4 +494,30 @@ public class SqlserverQueryProvider extends QueryProvider {
|
|||||||
}
|
}
|
||||||
return sql;
|
return sql;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String transDateFormat(String dateStyle, String datePattern) {
|
||||||
|
String split = "-";
|
||||||
|
if (StringUtils.equalsIgnoreCase(datePattern, "date_sub")) {
|
||||||
|
split = "-";
|
||||||
|
} else if (StringUtils.equalsIgnoreCase(datePattern, "date_split")) {
|
||||||
|
split = "/";
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (dateStyle) {
|
||||||
|
case "y":
|
||||||
|
return "%Y";
|
||||||
|
case "y_M":
|
||||||
|
return "%Y" + split + "%m";
|
||||||
|
case "y_M_d":
|
||||||
|
return "%Y" + split + "%m" + split + "%d";
|
||||||
|
case "H_m_s":
|
||||||
|
return "%H:%i:%S";
|
||||||
|
case "y_M_d_H_m":
|
||||||
|
return "%Y" + split + "%m" + split + "%d" + " %H:%i";
|
||||||
|
case "y_M_d_H_m_s":
|
||||||
|
return "%Y" + split + "%m" + split + "%d" + " %H:%i:%S";
|
||||||
|
default:
|
||||||
|
return "%Y-%m-%d %H:%i:%S";
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,7 @@ import io.dataease.commons.constants.JdbcConstants;
|
|||||||
import io.dataease.commons.utils.AuthUtils;
|
import io.dataease.commons.utils.AuthUtils;
|
||||||
import io.dataease.commons.utils.BeanUtils;
|
import io.dataease.commons.utils.BeanUtils;
|
||||||
import io.dataease.commons.utils.CommonBeanFactory;
|
import io.dataease.commons.utils.CommonBeanFactory;
|
||||||
|
import io.dataease.commons.utils.LogUtil;
|
||||||
import io.dataease.controller.request.chart.ChartExtFilterRequest;
|
import io.dataease.controller.request.chart.ChartExtFilterRequest;
|
||||||
import io.dataease.controller.request.chart.ChartExtRequest;
|
import io.dataease.controller.request.chart.ChartExtRequest;
|
||||||
import io.dataease.controller.request.chart.ChartGroupRequest;
|
import io.dataease.controller.request.chart.ChartGroupRequest;
|
||||||
@ -239,7 +240,23 @@ public class ChartViewService {
|
|||||||
else {
|
else {
|
||||||
data = (List<String[]>) cache;
|
data = (List<String[]>) cache;
|
||||||
}*/
|
}*/
|
||||||
data = cacheViewData(datasourceProvider, datasourceRequest, id);
|
// 仪表板有参数不实用缓存
|
||||||
|
if (CollectionUtils.isNotEmpty(requestList.getFilter())) {
|
||||||
|
data = datasourceProvider.getData(datasourceRequest);
|
||||||
|
}else {
|
||||||
|
try{
|
||||||
|
data = cacheViewData(datasourceProvider, datasourceRequest, id);
|
||||||
|
}catch (Exception e) {
|
||||||
|
LogUtil.error(e);
|
||||||
|
}finally {
|
||||||
|
// 如果当前对象被锁 且 当前线程冲入次数 > 0 则释放锁
|
||||||
|
if (lock.isLocked() && lock.getHoldCount() > 0) {
|
||||||
|
lock.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
if (StringUtils.containsIgnoreCase(view.getType(), "pie") && data.size() > 1000) {
|
if (StringUtils.containsIgnoreCase(view.getType(), "pie") && data.size() > 1000) {
|
||||||
data = data.subList(0, 1000);
|
data = data.subList(0, 1000);
|
||||||
@ -320,11 +337,17 @@ public class ChartViewService {
|
|||||||
Object cache = CacheUtils.get(JdbcConstants.VIEW_CACHE_KEY, viewId);
|
Object cache = CacheUtils.get(JdbcConstants.VIEW_CACHE_KEY, viewId);
|
||||||
if (cache == null) {
|
if (cache == null) {
|
||||||
if (lock.tryLock()) {// 获取锁成功
|
if (lock.tryLock()) {// 获取锁成功
|
||||||
result = datasourceProvider.getData(datasourceRequest);
|
try{
|
||||||
if (result != null) {
|
result = datasourceProvider.getData(datasourceRequest);
|
||||||
CacheUtils.put(JdbcConstants.VIEW_CACHE_KEY, viewId, result, null, null);
|
if (result != null) {
|
||||||
|
CacheUtils.put(JdbcConstants.VIEW_CACHE_KEY, viewId, result, null, null);
|
||||||
|
}
|
||||||
|
}catch (Exception e) {
|
||||||
|
LogUtil.error(e);
|
||||||
|
throw e;
|
||||||
|
}finally {
|
||||||
|
lock.unlock();
|
||||||
}
|
}
|
||||||
lock.unlock();
|
|
||||||
}else {//获取锁失败
|
}else {//获取锁失败
|
||||||
Thread.sleep(100);//避免CAS自旋频率过大 占用cpu资源过高
|
Thread.sleep(100);//避免CAS自旋频率过大 占用cpu资源过高
|
||||||
result = cacheViewData(datasourceProvider, datasourceRequest, viewId);
|
result = cacheViewData(datasourceProvider, datasourceRequest, viewId);
|
||||||
|
@ -282,52 +282,101 @@ public class DataSetTableService {
|
|||||||
realSize = Integer.parseInt(dataSetTableRequest.getRow()) % pageSize;
|
realSize = Integer.parseInt(dataSetTableRequest.getRow()) % pageSize;
|
||||||
}
|
}
|
||||||
if (StringUtils.equalsIgnoreCase(datasetTable.getType(), "db")) {
|
if (StringUtils.equalsIgnoreCase(datasetTable.getType(), "db")) {
|
||||||
Datasource ds = datasourceMapper.selectByPrimaryKey(dataSetTableRequest.getDataSourceId());
|
if (datasetTable.getMode() == 0) {
|
||||||
if (ObjectUtils.isEmpty(ds)) {
|
Datasource ds = datasourceMapper.selectByPrimaryKey(dataSetTableRequest.getDataSourceId());
|
||||||
throw new RuntimeException(Translator.get("i18n_datasource_delete"));
|
if (ObjectUtils.isEmpty(ds)) {
|
||||||
|
throw new RuntimeException(Translator.get("i18n_datasource_delete"));
|
||||||
|
}
|
||||||
|
DatasourceProvider datasourceProvider = ProviderFactory.getProvider(ds.getType());
|
||||||
|
DatasourceRequest datasourceRequest = new DatasourceRequest();
|
||||||
|
datasourceRequest.setDatasource(ds);
|
||||||
|
String table = dataTableInfoDTO.getTable();
|
||||||
|
QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType());
|
||||||
|
datasourceRequest.setQuery(qp.createQuerySQLWithPage(table, fields, page, pageSize, realSize));
|
||||||
|
try {
|
||||||
|
data.addAll(datasourceProvider.getData(datasourceRequest));
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
datasourceRequest.setQuery(qp.createQueryTableWithLimit(table, fields, Integer.valueOf(dataSetTableRequest.getRow())));
|
||||||
|
dataSetPreviewPage.setTotal(datasourceProvider.getData(datasourceRequest).size());
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// check doris table
|
||||||
|
if (!checkDorisTableIsExists(dataSetTableRequest.getId())) {
|
||||||
|
throw new RuntimeException(Translator.get("i18n_data_not_sync"));
|
||||||
|
}
|
||||||
|
Datasource ds = (Datasource) CommonBeanFactory.getBean("DorisDatasource");
|
||||||
|
JdbcProvider jdbcProvider = CommonBeanFactory.getBean(JdbcProvider.class);
|
||||||
|
DatasourceRequest datasourceRequest = new DatasourceRequest();
|
||||||
|
datasourceRequest.setDatasource(ds);
|
||||||
|
String table = DorisTableUtils.dorisName(dataSetTableRequest.getId());
|
||||||
|
QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType());
|
||||||
|
datasourceRequest.setQuery(qp.createQuerySQLWithPage(table, fields, page, pageSize, realSize));
|
||||||
|
try {
|
||||||
|
data.addAll(jdbcProvider.getData(datasourceRequest));
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
datasourceRequest.setQuery(qp.createQueryCountSQL(table));
|
||||||
|
dataSetPreviewPage.setTotal(Integer.valueOf(jdbcProvider.getData(datasourceRequest).get(0)[0]));
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
DatasourceProvider datasourceProvider = ProviderFactory.getProvider(ds.getType());
|
|
||||||
DatasourceRequest datasourceRequest = new DatasourceRequest();
|
|
||||||
datasourceRequest.setDatasource(ds);
|
|
||||||
|
|
||||||
String table = dataTableInfoDTO.getTable();
|
|
||||||
QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType());
|
|
||||||
datasourceRequest.setQuery(qp.createQuerySQLWithPage(table, fields, page, pageSize, realSize));
|
|
||||||
try {
|
|
||||||
data.addAll(datasourceProvider.getData(datasourceRequest));
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
datasourceRequest.setQuery(qp.createQueryTableWithLimit(table, fields, Integer.valueOf(dataSetTableRequest.getRow())));
|
|
||||||
dataSetPreviewPage.setTotal(datasourceProvider.getData(datasourceRequest).size());
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
} else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), "sql")) {
|
} else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), "sql")) {
|
||||||
Datasource ds = datasourceMapper.selectByPrimaryKey(dataSetTableRequest.getDataSourceId());
|
if (datasetTable.getMode() == 0) {
|
||||||
if (ObjectUtils.isEmpty(ds)) {
|
Datasource ds = datasourceMapper.selectByPrimaryKey(dataSetTableRequest.getDataSourceId());
|
||||||
throw new RuntimeException(Translator.get("i18n_datasource_delete"));
|
if (ObjectUtils.isEmpty(ds)) {
|
||||||
}
|
throw new RuntimeException(Translator.get("i18n_datasource_delete"));
|
||||||
DatasourceProvider datasourceProvider = ProviderFactory.getProvider(ds.getType());
|
}
|
||||||
DatasourceRequest datasourceRequest = new DatasourceRequest();
|
DatasourceProvider datasourceProvider = ProviderFactory.getProvider(ds.getType());
|
||||||
datasourceRequest.setDatasource(ds);
|
DatasourceRequest datasourceRequest = new DatasourceRequest();
|
||||||
|
datasourceRequest.setDatasource(ds);
|
||||||
|
|
||||||
String sql = dataTableInfoDTO.getSql();
|
String sql = dataTableInfoDTO.getSql();
|
||||||
QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType());
|
QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType());
|
||||||
datasourceRequest.setQuery(qp.createQuerySQLAsTmpWithPage(sql, fields, page, pageSize, realSize));
|
datasourceRequest.setQuery(qp.createQuerySQLAsTmpWithPage(sql, fields, page, pageSize, realSize));
|
||||||
System.out.println(datasourceRequest.getQuery());
|
|
||||||
try {
|
|
||||||
data.addAll(datasourceProvider.getData(datasourceRequest));
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
datasourceRequest.setQuery(qp.createQuerySqlWithLimit(sql, fields, Integer.valueOf(dataSetTableRequest.getRow())));
|
|
||||||
System.out.println(datasourceRequest.getQuery());
|
System.out.println(datasourceRequest.getQuery());
|
||||||
dataSetPreviewPage.setTotal(datasourceProvider.getData(datasourceRequest).size());
|
try {
|
||||||
} catch (Exception e) {
|
data.addAll(datasourceProvider.getData(datasourceRequest));
|
||||||
e.printStackTrace();
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
datasourceRequest.setQuery(qp.createQuerySqlWithLimit(sql, fields, Integer.valueOf(dataSetTableRequest.getRow())));
|
||||||
|
dataSetPreviewPage.setTotal(datasourceProvider.getData(datasourceRequest).size());
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// check doris table
|
||||||
|
if (!checkDorisTableIsExists(dataSetTableRequest.getId())) {
|
||||||
|
throw new RuntimeException(Translator.get("i18n_data_not_sync"));
|
||||||
|
}
|
||||||
|
Datasource ds = (Datasource) CommonBeanFactory.getBean("DorisDatasource");
|
||||||
|
JdbcProvider jdbcProvider = CommonBeanFactory.getBean(JdbcProvider.class);
|
||||||
|
DatasourceRequest datasourceRequest = new DatasourceRequest();
|
||||||
|
datasourceRequest.setDatasource(ds);
|
||||||
|
String table = DorisTableUtils.dorisName(dataSetTableRequest.getId());
|
||||||
|
QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType());
|
||||||
|
datasourceRequest.setQuery(qp.createQuerySQLWithPage(table, fields, page, pageSize, realSize));
|
||||||
|
try {
|
||||||
|
data.addAll(jdbcProvider.getData(datasourceRequest));
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
datasourceRequest.setQuery(qp.createQueryCountSQL(table));
|
||||||
|
dataSetPreviewPage.setTotal(Integer.valueOf(jdbcProvider.getData(datasourceRequest).get(0)[0]));
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), "excel")) {
|
} else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), "excel")) {
|
||||||
if (StringUtils.isEmpty(datasetTable.getSyncStatus()) || datasetTable.getSyncStatus().equalsIgnoreCase(JobStatus.Underway.name())) {
|
if (StringUtils.isEmpty(datasetTable.getSyncStatus()) || datasetTable.getSyncStatus().equalsIgnoreCase(JobStatus.Underway.name())) {
|
||||||
@ -363,7 +412,6 @@ public class DataSetTableService {
|
|||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), "custom")) {
|
} else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), "custom")) {
|
||||||
Datasource ds = (Datasource) CommonBeanFactory.getBean("DorisDatasource");
|
Datasource ds = (Datasource) CommonBeanFactory.getBean("DorisDatasource");
|
||||||
JdbcProvider jdbcProvider = CommonBeanFactory.getBean(JdbcProvider.class);
|
JdbcProvider jdbcProvider = CommonBeanFactory.getBean(JdbcProvider.class);
|
||||||
|
@ -4,7 +4,9 @@ package io.dataease.service.message;
|
|||||||
import io.dataease.base.domain.SysMsg;
|
import io.dataease.base.domain.SysMsg;
|
||||||
import io.dataease.base.domain.SysMsgExample;
|
import io.dataease.base.domain.SysMsgExample;
|
||||||
import io.dataease.base.mapper.SysMsgMapper;
|
import io.dataease.base.mapper.SysMsgMapper;
|
||||||
|
import io.dataease.base.mapper.ext.ExtSysMsgMapper;
|
||||||
import io.dataease.controller.message.dto.MsgRequest;
|
import io.dataease.controller.message.dto.MsgRequest;
|
||||||
|
import org.apache.commons.collections.CollectionUtils;
|
||||||
import org.apache.commons.lang3.ObjectUtils;
|
import org.apache.commons.lang3.ObjectUtils;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
@ -16,12 +18,20 @@ public class SysMsgService {
|
|||||||
@Resource
|
@Resource
|
||||||
private SysMsgMapper sysMsgMapper;
|
private SysMsgMapper sysMsgMapper;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private ExtSysMsgMapper extSysMsgMapper;
|
||||||
|
|
||||||
public List<SysMsg> query(Long userId, MsgRequest msgRequest) {
|
public List<SysMsg> query(Long userId, MsgRequest msgRequest) {
|
||||||
String orderClause = "";
|
String orderClause = " create_time desc";
|
||||||
SysMsgExample example = new SysMsgExample();
|
SysMsgExample example = new SysMsgExample();
|
||||||
SysMsgExample.Criteria criteria = example.createCriteria();
|
SysMsgExample.Criteria criteria = example.createCriteria();
|
||||||
criteria.andUserIdEqualTo(userId);
|
criteria.andUserIdEqualTo(userId);
|
||||||
|
|
||||||
|
List<String> orders = msgRequest.getOrders();
|
||||||
|
|
||||||
|
if (CollectionUtils.isNotEmpty(orders)) {
|
||||||
|
orderClause = String.join(", ", orders);
|
||||||
|
}
|
||||||
|
|
||||||
if (ObjectUtils.isNotEmpty(msgRequest.getType())) {
|
if (ObjectUtils.isNotEmpty(msgRequest.getType())) {
|
||||||
criteria.andTypeEqualTo(msgRequest.getType());
|
criteria.andTypeEqualTo(msgRequest.getType());
|
||||||
@ -29,11 +39,8 @@ public class SysMsgService {
|
|||||||
|
|
||||||
if (ObjectUtils.isNotEmpty(msgRequest.getStatus())) {
|
if (ObjectUtils.isNotEmpty(msgRequest.getStatus())) {
|
||||||
criteria.andStatusEqualTo(msgRequest.getStatus());
|
criteria.andStatusEqualTo(msgRequest.getStatus());
|
||||||
}else {
|
|
||||||
orderClause += " status asc ,";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
orderClause += " create_time desc";
|
|
||||||
example.setOrderByClause(orderClause);
|
example.setOrderByClause(orderClause);
|
||||||
List<SysMsg> sysMsgs = sysMsgMapper.selectByExample(example);
|
List<SysMsg> sysMsgs = sysMsgMapper.selectByExample(example);
|
||||||
return sysMsgs;
|
return sysMsgs;
|
||||||
@ -43,18 +50,20 @@ public class SysMsgService {
|
|||||||
SysMsg sysMsg = new SysMsg();
|
SysMsg sysMsg = new SysMsg();
|
||||||
sysMsg.setMsgId(msgId);
|
sysMsg.setMsgId(msgId);
|
||||||
sysMsg.setStatus(true);
|
sysMsg.setStatus(true);
|
||||||
|
sysMsg.setReadTime(System.currentTimeMillis());
|
||||||
sysMsgMapper.updateByPrimaryKeySelective(sysMsg);
|
sysMsgMapper.updateByPrimaryKeySelective(sysMsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void save(SysMsg sysMsg) {
|
public void setBatchReaded(List<Long> msgIds) {
|
||||||
// sysMsg.setStatus(false);
|
extSysMsgMapper.batchStatus(msgIds);
|
||||||
// sysMsg.setCreateTime(System.currentTimeMillis());
|
|
||||||
sysMsgMapper.insert(sysMsg);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void update(SysMsg sysMsg) {
|
public void batchDelete(List<Long> msgIds) {
|
||||||
|
extSysMsgMapper.batchDelete(msgIds);
|
||||||
|
}
|
||||||
|
|
||||||
sysMsgMapper.updateByPrimaryKey(sysMsg);
|
public void save(SysMsg sysMsg) {
|
||||||
|
sysMsgMapper.insert(sysMsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -14,11 +14,13 @@ import io.dataease.commons.model.AuthURD;
|
|||||||
import io.dataease.commons.utils.AuthUtils;
|
import io.dataease.commons.utils.AuthUtils;
|
||||||
import io.dataease.commons.utils.BeanUtils;
|
import io.dataease.commons.utils.BeanUtils;
|
||||||
import io.dataease.commons.utils.CommonBeanFactory;
|
import io.dataease.commons.utils.CommonBeanFactory;
|
||||||
|
import io.dataease.controller.request.panel.PanelShareFineDto;
|
||||||
import io.dataease.controller.request.panel.PanelShareRequest;
|
import io.dataease.controller.request.panel.PanelShareRequest;
|
||||||
import io.dataease.controller.sys.base.BaseGridRequest;
|
import io.dataease.controller.sys.base.BaseGridRequest;
|
||||||
import io.dataease.dto.panel.PanelShareDto;
|
import io.dataease.dto.panel.PanelShareDto;
|
||||||
import io.dataease.dto.panel.PanelSharePo;
|
import io.dataease.dto.panel.PanelSharePo;
|
||||||
import io.dataease.service.message.DeMsgutil;
|
import io.dataease.service.message.DeMsgutil;
|
||||||
|
import lombok.Data;
|
||||||
import org.apache.commons.collections.CollectionUtils;
|
import org.apache.commons.collections.CollectionUtils;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
@ -41,6 +43,176 @@ public class ShareService {
|
|||||||
@Resource
|
@Resource
|
||||||
private ExtPanelShareMapper extPanelShareMapper;
|
private ExtPanelShareMapper extPanelShareMapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 1.查询当前节点已经分享给了哪些目标
|
||||||
|
* 2.过滤出新增的目标
|
||||||
|
* 3.过滤出减少的目标
|
||||||
|
* 4.批量删除
|
||||||
|
* 5.批量新增
|
||||||
|
* 6.发送取消分享消息
|
||||||
|
* 7.发送新增分享消息
|
||||||
|
* @param panelShareFineDto
|
||||||
|
*/
|
||||||
|
@Transactional
|
||||||
|
public void fineSave(PanelShareFineDto panelShareFineDto) {
|
||||||
|
|
||||||
|
List<PanelShare> addShares = new ArrayList<>();//新增的分享
|
||||||
|
List<Long> redShareIdLists = new ArrayList<>();//取消的分享
|
||||||
|
|
||||||
|
String panelGroupId = panelShareFineDto.getResourceId();
|
||||||
|
AuthURD authURD = panelShareFineDto.getAuthURD();
|
||||||
|
AuthURD sharedAuthURD = new AuthURD();
|
||||||
|
AuthURD addAuthURD = new AuthURD();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Map<Integer, List<Long>> authURDMap = new HashMap<>();
|
||||||
|
authURDMap.put(0, authURD.getUserIds());
|
||||||
|
authURDMap.put(1, authURD.getRoleIds());
|
||||||
|
authURDMap.put(2, authURD.getDeptIds());
|
||||||
|
|
||||||
|
PanelShareExample example = new PanelShareExample();
|
||||||
|
example.createCriteria().andPanelGroupIdEqualTo(panelGroupId);
|
||||||
|
List<PanelShare> panelShares = mapper.selectByExample(example);
|
||||||
|
/*if (CollectionUtils.isEmpty(panelShares)) {
|
||||||
|
return;
|
||||||
|
}*/
|
||||||
|
Map<Integer, List<TempShareNode>> typeSharedMap = panelShares.stream().map(this::convertNode).collect(Collectors.groupingBy(TempShareNode::getType));
|
||||||
|
|
||||||
|
for (Map.Entry<Integer, List<Long>> entry : authURDMap.entrySet()) {
|
||||||
|
Integer key = entry.getKey();
|
||||||
|
List<TempShareNode> shareNodes = null;
|
||||||
|
if (null == typeSharedMap || null == typeSharedMap.get(key)) {
|
||||||
|
shareNodes = new ArrayList<>();
|
||||||
|
}else{
|
||||||
|
shareNodes = typeSharedMap.get(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (null != authURDMap.get(key)) {
|
||||||
|
Map<String, Object> dataMap = filterData(authURDMap.get(key), shareNodes);
|
||||||
|
List<Long> newIds = (List<Long>)dataMap.get("add");
|
||||||
|
for (int i = 0; i < newIds.size(); i++) {
|
||||||
|
Long id = newIds.get(i);
|
||||||
|
PanelShare share = new PanelShare();
|
||||||
|
share.setCreateTime(System.currentTimeMillis());
|
||||||
|
share.setPanelGroupId(panelGroupId);
|
||||||
|
share.setTargetId(id);
|
||||||
|
share.setType(key);
|
||||||
|
addShares.add(share);
|
||||||
|
}
|
||||||
|
List<TempShareNode> redNodes = (List<TempShareNode>)dataMap.get("red");
|
||||||
|
List<Long> redIds = redNodes.stream().map(TempShareNode::getShareId).distinct().collect(Collectors.toList());
|
||||||
|
|
||||||
|
redShareIdLists.addAll(redIds);
|
||||||
|
buildRedAuthURD(key, redNodes.stream().map(TempShareNode::getTargetId).distinct().collect(Collectors.toList()) , sharedAuthURD);
|
||||||
|
buildRedAuthURD(key, newIds, addAuthURD);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CollectionUtils.isNotEmpty(redShareIdLists)){
|
||||||
|
extPanelShareMapper.batchDelete(redShareIdLists);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CollectionUtils.isNotEmpty(addShares)){
|
||||||
|
extPanelShareMapper.batchInsert(addShares);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 以上是业务代码
|
||||||
|
// 下面是消息发送
|
||||||
|
Set<Long> addUserIdSet = AuthUtils.userIdsByURD(addAuthURD);
|
||||||
|
Set<Long> redUserIdSet = AuthUtils.userIdsByURD(sharedAuthURD);
|
||||||
|
|
||||||
|
|
||||||
|
PanelGroup panelGroup = panelGroupMapper.selectByPrimaryKey(panelGroupId);;
|
||||||
|
CurrentUserDto user = AuthUtils.getUser();
|
||||||
|
Gson gson = new Gson();
|
||||||
|
String msg = panelGroup.getName();
|
||||||
|
|
||||||
|
|
||||||
|
List<String> msgParam = new ArrayList<String>();
|
||||||
|
msgParam.add(panelGroupId);
|
||||||
|
addUserIdSet.forEach(userId -> {
|
||||||
|
if (!redUserIdSet.contains(userId)){
|
||||||
|
DeMsgutil.sendMsg(userId, 0, user.getNickName()+" 分享了仪表板【"+msg+"】,请查收!", gson.toJson(msgParam));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
redUserIdSet.forEach(userId -> {
|
||||||
|
if (!addUserIdSet.contains(userId)){
|
||||||
|
DeMsgutil.sendMsg(userId, 0, user.getNickName()+" 取消分享了仪表板【"+msg+"】,请查收!", gson.toJson(msgParam));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void buildRedAuthURD(Integer type, List<Long> redIds , AuthURD authURD) {
|
||||||
|
if (type == 0) {
|
||||||
|
authURD.setUserIds(redIds);
|
||||||
|
}
|
||||||
|
if (type == 1) {
|
||||||
|
authURD.setRoleIds(redIds);
|
||||||
|
}
|
||||||
|
if (type == 2) {
|
||||||
|
authURD.setDeptIds(redIds);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param newTargets 新的分享目标
|
||||||
|
* @param shareNodes 已景分享目标
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private Map<String, Object> filterData(List<Long> newTargets, List<TempShareNode> shareNodes) {
|
||||||
|
|
||||||
|
Map<String, Object> result = new HashMap<>();
|
||||||
|
/*if (null == newTargets) {
|
||||||
|
result.put("add", new ArrayList<>());
|
||||||
|
result.put("red", new ArrayList<>());
|
||||||
|
return result;
|
||||||
|
}*/
|
||||||
|
List<Long> newUserIds = new ArrayList<>();
|
||||||
|
for (int i = 0; i < newTargets.size(); i++) {
|
||||||
|
Long newTargetId = newTargets.get(i);
|
||||||
|
Boolean isNew = true;
|
||||||
|
for (int j = 0; j < shareNodes.size(); j++) {
|
||||||
|
TempShareNode shareNode = shareNodes.get(j);
|
||||||
|
Long sharedId = shareNode.getTargetId();
|
||||||
|
if (newTargetId == sharedId) {
|
||||||
|
shareNode.setMatched(true); // 已分享 重新命中
|
||||||
|
isNew = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (isNew) {
|
||||||
|
// 获取新增的
|
||||||
|
newUserIds.add(newTargetId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//获取需要取消分享的
|
||||||
|
List<TempShareNode> missNodes = shareNodes.stream().filter(item -> !item.getMatched()).collect(Collectors.toList());
|
||||||
|
result.put("add", newUserIds);
|
||||||
|
result.put("red", missNodes);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Data
|
||||||
|
private class TempShareNode {
|
||||||
|
private Long shareId;
|
||||||
|
private Integer type;
|
||||||
|
private Long targetId;
|
||||||
|
private Boolean matched = false;
|
||||||
|
|
||||||
|
public boolean targetMatch(Long tid) {
|
||||||
|
return targetId == tid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private TempShareNode convertNode(PanelShare panelShare) {
|
||||||
|
return BeanUtils.copyBean(new TempShareNode(), panelShare);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Transactional
|
@Transactional
|
||||||
public void save(PanelShareRequest request){
|
public void save(PanelShareRequest request){
|
||||||
List<PanelGroup> panelGroups = queryGroup(request.getPanelIds());
|
List<PanelGroup> panelGroups = queryGroup(request.getPanelIds());
|
||||||
|
@ -16,4 +16,16 @@ CREATE TABLE `sys_msg` (
|
|||||||
KEY `inx_msg_userid` (`user_id`) USING BTREE,
|
KEY `inx_msg_userid` (`user_id`) USING BTREE,
|
||||||
KEY `inx_msg_type` (`type`) USING BTREE,
|
KEY `inx_msg_type` (`type`) USING BTREE,
|
||||||
KEY `inx_msg_status` (`status`) USING BTREE
|
KEY `inx_msg_status` (`status`) USING BTREE
|
||||||
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='消息通知表';
|
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='消息通知表';
|
||||||
|
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO `sys_menu` VALUES (53, 1, 3, 1, '站内消息', 'sys-msg-web', 'msg/index', 1000, 'all-msg', 'system-msg-web', b'0', b'0', b'0', NULL, NULL, NULL, NULL, NULL);
|
||||||
|
INSERT INTO `sys_menu` VALUES (54, 53, 0, 1, '所有消息', 'sys-msg-web-all', 'msg/all', 1, 'web-msg', 'all', b'0', b'0', b'0', NULL, NULL, NULL, NULL, NULL);
|
||||||
|
INSERT INTO `sys_menu` VALUES (55, 53, 0, 1, '未读消息', 'sys-msg-web-unread', 'msg/unread', 2, 'unread-msg', 'unread', b'0', b'0', b'0', NULL, NULL, NULL, NULL, NULL);
|
||||||
|
INSERT INTO `sys_menu` VALUES (56, 53, 0, 1, '已读消息', 'sys-msg-web-readed', 'msg/readed', 3, 'readed-msg', 'readed', b'0', b'0', b'0', NULL, NULL, NULL, NULL, NULL);
|
||||||
|
COMMIT;
|
||||||
|
|
||||||
|
BEGIN;
|
||||||
|
UPDATE `sys_menu` SET permission = null WHERE menu_id = 1;
|
||||||
|
COMMIT;
|
||||||
|
|
||||||
|
@ -261,3 +261,9 @@ i18n_sql_delete_not_matching=The data column of incremental delete SQL does not
|
|||||||
i18n_cst_ds_tb_or_field_deleted=Custom dataset union data is deleted or field changed,can not display
|
i18n_cst_ds_tb_or_field_deleted=Custom dataset union data is deleted or field changed,can not display
|
||||||
i18n_no_all_delete_privilege_folder=This folder have sources which have no manage or view privilege,Can Not Be Deleted.
|
i18n_no_all_delete_privilege_folder=This folder have sources which have no manage or view privilege,Can Not Be Deleted.
|
||||||
i18n_excel_field_repeat=Excel exists repeat field,please fix and upload again.
|
i18n_excel_field_repeat=Excel exists repeat field,please fix and upload again.
|
||||||
|
i18n_schema_is_empty=Database schema is empty
|
||||||
|
站内消息=Internal Messages
|
||||||
|
所有消息=All Messages
|
||||||
|
未读消息=Unread Messages
|
||||||
|
已读消息=Read Messages
|
||||||
|
i18n_data_not_sync=Please sync data first
|
@ -260,3 +260,9 @@ i18n_sql_delete_not_matching=增量删除 sql 的数据列与数据集不匹配,
|
|||||||
i18n_cst_ds_tb_or_field_deleted=自定义数据集所关联数据被删除或字段发生变化,无法正常显示
|
i18n_cst_ds_tb_or_field_deleted=自定义数据集所关联数据被删除或字段发生变化,无法正常显示
|
||||||
i18n_no_all_delete_privilege_folder=该目录下存在没有管理权限或查看权限的资源,无法删除
|
i18n_no_all_delete_privilege_folder=该目录下存在没有管理权限或查看权限的资源,无法删除
|
||||||
i18n_excel_field_repeat=Excel存在重复字段,请修改后重新上传
|
i18n_excel_field_repeat=Excel存在重复字段,请修改后重新上传
|
||||||
|
i18n_schema_is_empty=数据库 Schema 为空
|
||||||
|
站内消息=站内消息
|
||||||
|
所有消息=所有消息
|
||||||
|
未读消息=未读消息
|
||||||
|
已读消息=已读消息
|
||||||
|
i18n_data_not_sync=请先完成数据同步
|
||||||
|
@ -263,3 +263,9 @@ i18n_sql_delete_not_matching=增量刪除 sql 的數據列與數據集不匹配,
|
|||||||
i18n_cst_ds_tb_or_field_deleted=自定義數據集所關聯數據被刪除或字段發生變化,無法正常顯示
|
i18n_cst_ds_tb_or_field_deleted=自定義數據集所關聯數據被刪除或字段發生變化,無法正常顯示
|
||||||
i18n_no_all_delete_privilege_folder=該目錄下存在沒有管理權限或查看權限的資源,無法刪除
|
i18n_no_all_delete_privilege_folder=該目錄下存在沒有管理權限或查看權限的資源,無法刪除
|
||||||
i18n_excel_field_repeat=Excel存在重復字段,請修改後重新上傳
|
i18n_excel_field_repeat=Excel存在重復字段,請修改後重新上傳
|
||||||
|
i18n_schema_is_empty=數據庫 Schema 為空
|
||||||
|
站内消息=站內消息
|
||||||
|
所有消息=所有消息
|
||||||
|
未读消息=未讀消息
|
||||||
|
已读消息=已讀消息
|
||||||
|
i18n_data_not_sync=請先完成數據同步
|
@ -27,3 +27,12 @@ export function loadTree(data) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function fineSave(data) {
|
||||||
|
return request({
|
||||||
|
url: '/api/share/fineSave',
|
||||||
|
method: 'post',
|
||||||
|
loading: true,
|
||||||
|
data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -50,4 +50,13 @@ export function validateDs(data) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export default { dsGrid, addDs, editDs, delDs, validateDs, listDatasource }
|
export function getSchema(data) {
|
||||||
|
return request({
|
||||||
|
url: 'datasource/getSchema/',
|
||||||
|
method: 'post',
|
||||||
|
loading: true,
|
||||||
|
data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export default { dsGrid, addDs, editDs, delDs, validateDs, listDatasource, getSchema }
|
||||||
|
@ -4,7 +4,7 @@ export function query(pageIndex, pageSize, data) {
|
|||||||
return request({
|
return request({
|
||||||
url: '/api/sys_msg/list/' + pageIndex + '/' + pageSize,
|
url: '/api/sys_msg/list/' + pageIndex + '/' + pageSize,
|
||||||
method: 'post',
|
method: 'post',
|
||||||
loading: true,
|
loading: false,
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -17,3 +17,12 @@ export function updateStatus(msgId) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function batchRead(data) {
|
||||||
|
return request({
|
||||||
|
url: '/api/sys_msg/batchRead',
|
||||||
|
method: 'post',
|
||||||
|
loading: true,
|
||||||
|
data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -41,9 +41,9 @@
|
|||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
<div class="msg-foot-class">
|
<div class="msg-foot-class" @click="showMore">
|
||||||
<el-row style="padding: 5px 0;margin-bottom: -5px;cursor:point;" @click="showMore">
|
<el-row style="padding: 5px 0;margin-bottom: -5px;cursor:point;" @click="showMore">
|
||||||
<span @click="showMore">{{ $t('webmsg.show_more') }}</span>
|
<span>{{ $t('webmsg.show_more') }}</span>
|
||||||
</el-row>
|
</el-row>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -62,6 +62,8 @@
|
|||||||
<script>
|
<script>
|
||||||
import { query, updateStatus } from '@/api/system/msg'
|
import { query, updateStatus } from '@/api/system/msg'
|
||||||
import { msgTypes, getTypeName } from '@/utils/webMsg'
|
import { msgTypes, getTypeName } from '@/utils/webMsg'
|
||||||
|
import { mapGetters } from 'vuex'
|
||||||
|
import bus from '@/utils/bus'
|
||||||
export default {
|
export default {
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
@ -73,28 +75,49 @@ export default {
|
|||||||
currentPage: 1,
|
currentPage: 1,
|
||||||
pageSize: 5,
|
pageSize: 5,
|
||||||
total: 0
|
total: 0
|
||||||
}
|
},
|
||||||
|
timer: null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
|
...mapGetters([
|
||||||
|
'permission_routes'
|
||||||
|
])
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
this.search()
|
this.search()
|
||||||
// 每30s定时刷新拉取消息
|
// 每30s定时刷新拉取消息
|
||||||
setInterval(() => {
|
this.timer = setInterval(() => {
|
||||||
this.search()
|
this.search()
|
||||||
}, 30000)
|
}, 30000)
|
||||||
},
|
},
|
||||||
|
mounted() {
|
||||||
|
bus.$on('refresh-top-notification', () => {
|
||||||
|
this.search()
|
||||||
|
})
|
||||||
|
},
|
||||||
|
beforeDestroy() {
|
||||||
|
this.timer && clearInterval(this.timer)
|
||||||
|
},
|
||||||
|
destroyed() {
|
||||||
|
this.timer && clearInterval(this.timer)
|
||||||
|
},
|
||||||
methods: {
|
methods: {
|
||||||
handClick(lang) {
|
// handClick(lang) {
|
||||||
console.log(lang)
|
// console.log(lang)
|
||||||
},
|
// },
|
||||||
showDetail(row) {
|
showDetail(row) {
|
||||||
const param = { ...{ msgNotification: true, msgType: row.type, sourceParam: row.param }}
|
const param = { ...{ msgNotification: true, msgType: row.type, sourceParam: row.param }}
|
||||||
this.visible = false
|
this.visible = false
|
||||||
this.$router.push({ name: row.router, params: param })
|
if (this.$route && this.$route.name && this.$route.name.includes('panel') && row.type === 0) {
|
||||||
this.setReaded(row.msgId)
|
bus.$emit('to-msg-share', param)
|
||||||
|
} else if (this.$route && this.$route.name && this.$route.name.includes('dataset') && row.type === 1) {
|
||||||
|
bus.$emit('to-msg-dataset', param)
|
||||||
|
} else {
|
||||||
|
this.$router.push({ name: row.router, params: param })
|
||||||
|
}
|
||||||
|
|
||||||
|
row.status || this.setReaded(row.msgId)
|
||||||
},
|
},
|
||||||
remove(row) {
|
remove(row) {
|
||||||
|
|
||||||
@ -106,11 +129,24 @@ export default {
|
|||||||
const routerName = 'sys-msg-web-all'
|
const routerName = 'sys-msg-web-all'
|
||||||
this.visible = false
|
this.visible = false
|
||||||
this.$router.push({ name: routerName })
|
this.$router.push({ name: routerName })
|
||||||
this.$emit('refresh-top-bar')
|
this.openSystem()
|
||||||
|
},
|
||||||
|
openSystem() {
|
||||||
|
const path = '/system'
|
||||||
|
let route = this.permission_routes.find(
|
||||||
|
item => item.path === '/' + path.split('/')[1]
|
||||||
|
)
|
||||||
|
// 如果找不到这个路由,说明是首页
|
||||||
|
if (!route) {
|
||||||
|
route = this.permission_routes.find(item => item.path === '/')
|
||||||
|
}
|
||||||
|
this.$store.commit('permission/SET_CURRENT_ROUTES', route)
|
||||||
|
// this.setSidebarHide(route)
|
||||||
},
|
},
|
||||||
search() {
|
search() {
|
||||||
const param = {
|
const param = {
|
||||||
status: false
|
status: false,
|
||||||
|
orders: [' create_time desc ']
|
||||||
}
|
}
|
||||||
const { currentPage, pageSize } = this.paginationConfig
|
const { currentPage, pageSize } = this.paginationConfig
|
||||||
query(currentPage, pageSize, param).then(response => {
|
query(currentPage, pageSize, param).then(response => {
|
||||||
|
@ -1,4 +1,46 @@
|
|||||||
export default {
|
export default {
|
||||||
|
fu: {
|
||||||
|
search_bar: {
|
||||||
|
search: 'Search',
|
||||||
|
adv_search: 'Advanced search',
|
||||||
|
ok: 'Confirm',
|
||||||
|
cancel: 'Cancel',
|
||||||
|
please_select: 'Please select',
|
||||||
|
please_input: 'Please input',
|
||||||
|
like: 'like ',
|
||||||
|
not_like: 'not like',
|
||||||
|
in: 'in',
|
||||||
|
not_in: 'not in',
|
||||||
|
gt: 'greater than',
|
||||||
|
ge: 'Greater than or equal to',
|
||||||
|
lt: 'less than',
|
||||||
|
le: 'Less than or equal to',
|
||||||
|
eq: 'equal to',
|
||||||
|
ne: 'bot equal to',
|
||||||
|
between: 'between',
|
||||||
|
select_date: 'Select a date',
|
||||||
|
start_date: 'Start date',
|
||||||
|
end_date: 'End date',
|
||||||
|
select_date_time: 'Select date time',
|
||||||
|
start_date_time: 'Start date time',
|
||||||
|
end_date_time: 'End date time',
|
||||||
|
range_separator: 'To',
|
||||||
|
data_time_error: 'The start date cannot be greater than the end date',
|
||||||
|
clean: 'Clean',
|
||||||
|
refresh: 'Refresh'
|
||||||
|
},
|
||||||
|
table: {
|
||||||
|
ok: 'Confirm',
|
||||||
|
custom_table_fields: 'Custom table fields',
|
||||||
|
custom_table_fields_desc: 'Fixed field is not in the selection range'
|
||||||
|
},
|
||||||
|
steps: {
|
||||||
|
cancel: 'Cancle',
|
||||||
|
next: 'next',
|
||||||
|
prev: 'Last step',
|
||||||
|
finish: 'Finish'
|
||||||
|
}
|
||||||
|
},
|
||||||
route: {
|
route: {
|
||||||
dashboard: 'Dashboard',
|
dashboard: 'Dashboard',
|
||||||
documentation: 'Documentation',
|
documentation: 'Documentation',
|
||||||
@ -707,8 +749,8 @@ export default {
|
|||||||
chart_funnel: 'Funnel',
|
chart_funnel: 'Funnel',
|
||||||
chart_radar: 'Radar',
|
chart_radar: 'Radar',
|
||||||
chart_gauge: 'Gauge',
|
chart_gauge: 'Gauge',
|
||||||
dateStyle: '日期顯示',
|
dateStyle: 'Date Style',
|
||||||
datePattern: '日期格式',
|
datePattern: 'Date Format',
|
||||||
y: 'Year',
|
y: 'Year',
|
||||||
y_M: 'Year Month',
|
y_M: 'Year Month',
|
||||||
y_M_d: 'Year Month Day',
|
y_M_d: 'Year Month Day',
|
||||||
@ -741,7 +783,18 @@ export default {
|
|||||||
axis_name_fontsize: 'Name Fontsize',
|
axis_name_fontsize: 'Name Fontsize',
|
||||||
pie_label_line_show: 'Line',
|
pie_label_line_show: 'Line',
|
||||||
outside: 'Outside',
|
outside: 'Outside',
|
||||||
center: 'Center'
|
center: 'Center',
|
||||||
|
split: 'Axis',
|
||||||
|
axis_line: 'Axis Line',
|
||||||
|
axis_label: 'Axis Label',
|
||||||
|
label_fontsize: 'Label Fontsize',
|
||||||
|
split_line: 'Split Line',
|
||||||
|
split_color: 'Split Color',
|
||||||
|
shadow: 'Shadow',
|
||||||
|
condition: 'Filter Value',
|
||||||
|
filter_value_can_null: 'Filter value can not empty',
|
||||||
|
filter_like: 'Contain',
|
||||||
|
filter_not_like: 'Not Contain'
|
||||||
},
|
},
|
||||||
dataset: {
|
dataset: {
|
||||||
sheet_warn: 'There are multiple sheet pages, and the first one is extracted by default',
|
sheet_warn: 'There are multiple sheet pages, and the first one is extracted by default',
|
||||||
@ -892,7 +945,13 @@ export default {
|
|||||||
delete_warning: 'Confirm to delete?',
|
delete_warning: 'Confirm to delete?',
|
||||||
input_name: 'Please input name',
|
input_name: 'Please input name',
|
||||||
input_limit_2_25: '2-25 chars',
|
input_limit_2_25: '2-25 chars',
|
||||||
input_limit_0_50: '0-50 chars'
|
input_limit_0_50: '0-50 chars',
|
||||||
|
oracle_connection_type: 'Service Name/SID',
|
||||||
|
oracle_sid: 'SID',
|
||||||
|
oracle_service_name: 'Service Name',
|
||||||
|
get_schema: 'Get Schema',
|
||||||
|
schema: 'Database Schema',
|
||||||
|
please_choose_schema: 'Please select Schema'
|
||||||
},
|
},
|
||||||
pblink: {
|
pblink: {
|
||||||
key_pwd: 'Please enter the password to open the link',
|
key_pwd: 'Please enter the password to open the link',
|
||||||
@ -1145,6 +1204,13 @@ export default {
|
|||||||
show_more: 'View more',
|
show_more: 'View more',
|
||||||
all_type: 'All type',
|
all_type: 'All type',
|
||||||
panel_type: 'Panel Share',
|
panel_type: 'Panel Share',
|
||||||
dataset_type: 'Dataset sync'
|
dataset_type: 'Dataset sync',
|
||||||
|
content: 'Content',
|
||||||
|
sned_time: 'Send Time',
|
||||||
|
read_time: 'Read Time',
|
||||||
|
type: 'Type',
|
||||||
|
mark_readed: 'Mark As Read',
|
||||||
|
please_select: 'Please select at least one message',
|
||||||
|
mark_success: 'Mark read successfully'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -783,7 +783,18 @@ export default {
|
|||||||
axis_name_fontsize: '名稱字體',
|
axis_name_fontsize: '名稱字體',
|
||||||
pie_label_line_show: '引導線',
|
pie_label_line_show: '引導線',
|
||||||
outside: '外',
|
outside: '外',
|
||||||
center: '中心'
|
center: '中心',
|
||||||
|
split: '軸線',
|
||||||
|
axis_line: '軸線',
|
||||||
|
axis_label: '軸標簽',
|
||||||
|
label_fontsize: '標簽大小',
|
||||||
|
split_line: '分割線',
|
||||||
|
split_color: '分割顏色',
|
||||||
|
shadow: '陰影',
|
||||||
|
condition: '過濾值',
|
||||||
|
filter_value_can_null: '過濾值不能為空',
|
||||||
|
filter_like: '包含',
|
||||||
|
filter_not_like: '不包含'
|
||||||
},
|
},
|
||||||
dataset: {
|
dataset: {
|
||||||
sheet_warn: '有多個sheet頁面,默認抽取第一個',
|
sheet_warn: '有多個sheet頁面,默認抽取第一個',
|
||||||
@ -934,7 +945,13 @@ export default {
|
|||||||
delete_warning: '確認刪除?',
|
delete_warning: '確認刪除?',
|
||||||
input_name: '請輸入名稱',
|
input_name: '請輸入名稱',
|
||||||
input_limit_2_25: '2-25字符',
|
input_limit_2_25: '2-25字符',
|
||||||
input_limit_0_50: '0-50字符'
|
input_limit_0_50: '0-50字符',
|
||||||
|
oracle_connection_type: '服務名/SID',
|
||||||
|
oracle_sid: 'SID',
|
||||||
|
oracle_service_name: '服務名',
|
||||||
|
get_schema: '獲取 Schema',
|
||||||
|
schema: '數據庫 Schema',
|
||||||
|
please_choose_schema: '請選擇數據庫 Schema'
|
||||||
},
|
},
|
||||||
pblink: {
|
pblink: {
|
||||||
key_pwd: '請輸入密碼打開鏈接',
|
key_pwd: '請輸入密碼打開鏈接',
|
||||||
@ -1187,6 +1204,13 @@ export default {
|
|||||||
show_more: '查看更多',
|
show_more: '查看更多',
|
||||||
all_type: '全部類型',
|
all_type: '全部類型',
|
||||||
panel_type: '儀表板分享',
|
panel_type: '儀表板分享',
|
||||||
dataset_type: '數據集同步'
|
dataset_type: '數據集同步',
|
||||||
|
content: '消息內容',
|
||||||
|
sned_time: '提交時間',
|
||||||
|
read_time: '查看時間',
|
||||||
|
type: '類型',
|
||||||
|
mark_readed: '標記已讀',
|
||||||
|
please_select: '請至少選擇一條消息',
|
||||||
|
mark_success: '標記已讀成功'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,46 @@
|
|||||||
export default {
|
export default {
|
||||||
|
fu: {
|
||||||
|
search_bar: {
|
||||||
|
search: '搜索',
|
||||||
|
adv_search: '高級搜索',
|
||||||
|
ok: '确定',
|
||||||
|
cancel: '取消',
|
||||||
|
please_select: '请选择',
|
||||||
|
please_input: '请输入',
|
||||||
|
like: '包含',
|
||||||
|
not_like: '不包含',
|
||||||
|
in: '属于',
|
||||||
|
not_in: '不屬于',
|
||||||
|
gt: '大于',
|
||||||
|
ge: '大于等于',
|
||||||
|
lt: '小于',
|
||||||
|
le: '小于等于',
|
||||||
|
eq: '等于',
|
||||||
|
ne: '不等于',
|
||||||
|
between: '之间',
|
||||||
|
select_date: '选择日期',
|
||||||
|
start_date: '开始日期',
|
||||||
|
end_date: '結束日期',
|
||||||
|
select_date_time: '选择日期时间',
|
||||||
|
start_date_time: '开始日期时间',
|
||||||
|
end_date_time: '結束日期时间',
|
||||||
|
range_separator: '至',
|
||||||
|
data_time_error: '开始日期不能大于結束日期',
|
||||||
|
clean: '清空',
|
||||||
|
refresh: '刷新'
|
||||||
|
},
|
||||||
|
table: {
|
||||||
|
ok: '确定',
|
||||||
|
custom_table_fields: '自定义表格字段',
|
||||||
|
custom_table_fields_desc: '固定字段不在选择范围'
|
||||||
|
},
|
||||||
|
steps: {
|
||||||
|
cancel: '取消',
|
||||||
|
next: '下一步',
|
||||||
|
prev: '上一步',
|
||||||
|
finish: '完成'
|
||||||
|
}
|
||||||
|
},
|
||||||
route: {
|
route: {
|
||||||
dashboard: '首页',
|
dashboard: '首页',
|
||||||
documentation: '文档',
|
documentation: '文档',
|
||||||
@ -741,7 +783,18 @@ export default {
|
|||||||
axis_name_fontsize: '名称字体',
|
axis_name_fontsize: '名称字体',
|
||||||
pie_label_line_show: '引导线',
|
pie_label_line_show: '引导线',
|
||||||
outside: '外',
|
outside: '外',
|
||||||
center: '中心'
|
center: '中心',
|
||||||
|
split: '轴线',
|
||||||
|
axis_line: '轴线',
|
||||||
|
axis_label: '轴标签',
|
||||||
|
label_fontsize: '标签大小',
|
||||||
|
split_line: '分割线',
|
||||||
|
split_color: '分割颜色',
|
||||||
|
shadow: '阴影',
|
||||||
|
condition: '过滤值',
|
||||||
|
filter_value_can_null: '过滤值不能为空',
|
||||||
|
filter_like: '包含',
|
||||||
|
filter_not_like: '不包含'
|
||||||
},
|
},
|
||||||
dataset: {
|
dataset: {
|
||||||
sheet_warn: '有多个 Sheet 页,默认抽取第一个',
|
sheet_warn: '有多个 Sheet 页,默认抽取第一个',
|
||||||
@ -896,7 +949,10 @@ export default {
|
|||||||
input_limit_0_50: '0-50字符',
|
input_limit_0_50: '0-50字符',
|
||||||
oracle_connection_type: '服务名/SID',
|
oracle_connection_type: '服务名/SID',
|
||||||
oracle_sid: 'SID',
|
oracle_sid: 'SID',
|
||||||
oracle_service_name: '服务名'
|
oracle_service_name: '服务名',
|
||||||
|
get_schema: '获取 Schema',
|
||||||
|
schema: '数据库 Schema',
|
||||||
|
please_choose_schema: '请选择数据库 Schema'
|
||||||
},
|
},
|
||||||
pblink: {
|
pblink: {
|
||||||
key_pwd: '请输入密码打开链接',
|
key_pwd: '请输入密码打开链接',
|
||||||
@ -1150,6 +1206,13 @@ export default {
|
|||||||
show_more: '查看更多',
|
show_more: '查看更多',
|
||||||
all_type: '全部类型',
|
all_type: '全部类型',
|
||||||
panel_type: '仪表板分享',
|
panel_type: '仪表板分享',
|
||||||
dataset_type: '数据集同步'
|
dataset_type: '数据集同步',
|
||||||
|
content: '消息内容',
|
||||||
|
sned_time: '提交时间',
|
||||||
|
read_time: '查看时间',
|
||||||
|
type: '类型',
|
||||||
|
mark_readed: '标记已读',
|
||||||
|
please_select: '请至少选择一条消息',
|
||||||
|
mark_success: '标记已读成功'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -35,7 +35,7 @@
|
|||||||
<!-- <el-tooltip :content="$t('navbar.size')" effect="dark" placement="bottom">
|
<!-- <el-tooltip :content="$t('navbar.size')" effect="dark" placement="bottom">
|
||||||
<size-select id="size-select" class="right-menu-item hover-effect" />
|
<size-select id="size-select" class="right-menu-item hover-effect" />
|
||||||
</el-tooltip> -->
|
</el-tooltip> -->
|
||||||
<notification class="right-menu-item hover-effect" @refresh-top-bar="initCurrentRoutes" />
|
<notification class="right-menu-item hover-effect" />
|
||||||
<lang-select class="right-menu-item hover-effect" />
|
<lang-select class="right-menu-item hover-effect" />
|
||||||
<div style="height: 100%;padding: 0 8px;" class="right-menu-item hover-effect">
|
<div style="height: 100%;padding: 0 8px;" class="right-menu-item hover-effect">
|
||||||
<a href="https://dataease.io/docs/" target="_blank" style="display: flex;height: 100%;width: 100%;justify-content: center;align-items: center;">
|
<a href="https://dataease.io/docs/" target="_blank" style="display: flex;height: 100%;width: 100%;justify-content: center;align-items: center;">
|
||||||
|
@ -76,7 +76,7 @@ export const loadMenus = (next, to) => {
|
|||||||
buildMenus().then(res => {
|
buildMenus().then(res => {
|
||||||
const filterDatas = filterRouter(res.data)
|
const filterDatas = filterRouter(res.data)
|
||||||
const asyncRouter = filterAsyncRouter(filterDatas)
|
const asyncRouter = filterAsyncRouter(filterDatas)
|
||||||
addMsgMenu(asyncRouter)
|
// addMsgMenu(asyncRouter)
|
||||||
asyncRouter.push({ path: '*', redirect: '/404', hidden: true })
|
asyncRouter.push({ path: '*', redirect: '/404', hidden: true })
|
||||||
store.dispatch('permission/GenerateRoutes', asyncRouter).then(() => { // 存储路由
|
store.dispatch('permission/GenerateRoutes', asyncRouter).then(() => { // 存储路由
|
||||||
router.addRoutes(asyncRouter)
|
router.addRoutes(asyncRouter)
|
||||||
|
@ -132,6 +132,50 @@ export const DEFAULT_BACKGROUND_COLOR = {
|
|||||||
color: '#ffffff',
|
color: '#ffffff',
|
||||||
alpha: 0
|
alpha: 0
|
||||||
}
|
}
|
||||||
|
export const DEFAULT_SPLIT = {
|
||||||
|
name: {
|
||||||
|
show: true,
|
||||||
|
color: '#999999',
|
||||||
|
fontSize: '12'
|
||||||
|
},
|
||||||
|
splitNumber: 5,
|
||||||
|
axisLine: {
|
||||||
|
show: true,
|
||||||
|
lineStyle: {
|
||||||
|
color: '#999999',
|
||||||
|
width: 1,
|
||||||
|
type: 'solid'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
axisTick: {
|
||||||
|
show: false,
|
||||||
|
length: 5,
|
||||||
|
lineStyle: {
|
||||||
|
color: '#999999',
|
||||||
|
width: 1,
|
||||||
|
type: 'solid'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
axisLabel: {
|
||||||
|
show: false,
|
||||||
|
rotate: 0,
|
||||||
|
margin: 8,
|
||||||
|
color: '#999999',
|
||||||
|
fontSize: '12',
|
||||||
|
formatter: '{value}'
|
||||||
|
},
|
||||||
|
splitLine: {
|
||||||
|
show: true,
|
||||||
|
lineStyle: {
|
||||||
|
color: '#999999',
|
||||||
|
width: 1,
|
||||||
|
type: 'solid'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
splitArea: {
|
||||||
|
show: true
|
||||||
|
}
|
||||||
|
}
|
||||||
// chart config
|
// chart config
|
||||||
export const BASE_BAR = {
|
export const BASE_BAR = {
|
||||||
title: {
|
title: {
|
||||||
@ -349,13 +393,47 @@ export const BASE_RADAR = {
|
|||||||
radar: {
|
radar: {
|
||||||
shape: 'polygon',
|
shape: 'polygon',
|
||||||
name: {
|
name: {
|
||||||
textStyle: {
|
show: true,
|
||||||
color: '#000000'
|
color: '#999999',
|
||||||
// backgroundColor: '#999',
|
fontSize: '12'
|
||||||
// borderRadius: 3,
|
},
|
||||||
// padding: [3, 5]
|
splitNumber: 5,
|
||||||
|
axisLine: {
|
||||||
|
show: true,
|
||||||
|
lineStyle: {
|
||||||
|
color: '#999999',
|
||||||
|
width: 1,
|
||||||
|
type: 'solid'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
axisTick: {
|
||||||
|
show: false,
|
||||||
|
length: 5,
|
||||||
|
lineStyle: {
|
||||||
|
color: '#999999',
|
||||||
|
width: 1,
|
||||||
|
type: 'solid'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
axisLabel: {
|
||||||
|
show: false,
|
||||||
|
rotate: 0,
|
||||||
|
margin: 8,
|
||||||
|
color: '#999999',
|
||||||
|
fontSize: '12',
|
||||||
|
formatter: '{value}'
|
||||||
|
},
|
||||||
|
splitLine: {
|
||||||
|
show: true,
|
||||||
|
lineStyle: {
|
||||||
|
color: '#999999',
|
||||||
|
width: 1,
|
||||||
|
type: 'solid'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
splitArea: {
|
||||||
|
show: true
|
||||||
|
},
|
||||||
indicator: []
|
indicator: []
|
||||||
},
|
},
|
||||||
series: [{
|
series: [{
|
||||||
|
@ -38,6 +38,15 @@ export function componentStyle(chart_option, chart) {
|
|||||||
chart_option.yAxis.splitLine = customStyle.yAxis.splitLine
|
chart_option.yAxis.splitLine = customStyle.yAxis.splitLine
|
||||||
chart_option.yAxis.nameTextStyle = customStyle.yAxis.nameTextStyle
|
chart_option.yAxis.nameTextStyle = customStyle.yAxis.nameTextStyle
|
||||||
}
|
}
|
||||||
|
if (customStyle.split && chart.type.includes('radar')) {
|
||||||
|
chart_option.radar.name = customStyle.split.name
|
||||||
|
chart_option.radar.splitNumber = customStyle.split.splitNumber
|
||||||
|
chart_option.radar.axisLine = customStyle.split.axisLine
|
||||||
|
chart_option.radar.axisTick = customStyle.split.axisTick
|
||||||
|
chart_option.radar.axisLabel = customStyle.split.axisLabel
|
||||||
|
chart_option.radar.splitLine = customStyle.split.splitLine
|
||||||
|
chart_option.radar.splitArea = customStyle.split.splitArea
|
||||||
|
}
|
||||||
if (customStyle.background) {
|
if (customStyle.background) {
|
||||||
chart_option.backgroundColor = hexColorToRGBA(customStyle.background.color, customStyle.background.alpha)
|
chart_option.backgroundColor = hexColorToRGBA(customStyle.background.color, customStyle.background.alpha)
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,155 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<div style="width: 100%">
|
||||||
|
<el-popover
|
||||||
|
placement="right"
|
||||||
|
width="400"
|
||||||
|
trigger="click"
|
||||||
|
>
|
||||||
|
<el-col>
|
||||||
|
<el-form ref="splitForm" :model="splitForm" label-width="80px" size="mini">
|
||||||
|
<el-form-item :label="$t('chart.name')" class="form-item">
|
||||||
|
<el-checkbox v-model="splitForm.name.show" @change="changeSplitStyle">{{ $t('chart.show') }}</el-checkbox>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item :label="$t('chart.color')" class="form-item">
|
||||||
|
<colorPicker v-model="splitForm.name.color" style="margin-top: 6px;cursor: pointer;z-index: 1004;border: solid 1px black" @change="changeSplitStyle" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item :label="$t('chart.text_fontsize')" class="form-item form-item-slider">
|
||||||
|
<el-select v-model="splitForm.name.fontSize" :placeholder="$t('chart.text_fontsize')" @change="changeSplitStyle">
|
||||||
|
<el-option v-for="option in fontSize" :key="option.value" :label="option.name" :value="option.value" />
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item :label="$t('chart.axis_line')" class="form-item">
|
||||||
|
<el-checkbox v-model="splitForm.axisLine.show" @change="changeSplitStyle">{{ $t('chart.show') }}</el-checkbox>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item :label="$t('chart.axis_color')" class="form-item">
|
||||||
|
<colorPicker v-model="splitForm.axisLine.lineStyle.color" style="margin-top: 6px;cursor: pointer;z-index: 1004;border: solid 1px black" @change="changeSplitStyle" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item :label="$t('chart.axis_label')" class="form-item">
|
||||||
|
<el-checkbox v-model="splitForm.axisLabel.show" @change="changeSplitStyle">{{ $t('chart.show') }}</el-checkbox>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item :label="$t('chart.axis_label_color')" class="form-item">
|
||||||
|
<colorPicker v-model="splitForm.axisLabel.color" style="margin-top: 6px;cursor: pointer;z-index: 1004;border: solid 1px black" @change="changeSplitStyle" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item :label="$t('chart.label_fontsize')" class="form-item form-item-slider">
|
||||||
|
<el-select v-model="splitForm.axisLabel.fontSize" :placeholder="$t('chart.label_fontsize')" @change="changeSplitStyle">
|
||||||
|
<el-option v-for="option in fontSize" :key="option.value" :label="option.name" :value="option.value" />
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item :label="$t('chart.split_line')" class="form-item">
|
||||||
|
<el-checkbox v-model="splitForm.splitLine.show" @change="changeSplitStyle">{{ $t('chart.show') }}</el-checkbox>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item :label="$t('chart.split_color')" class="form-item">
|
||||||
|
<colorPicker v-model="splitForm.splitLine.lineStyle.color" style="margin-top: 6px;cursor: pointer;z-index: 1004;border: solid 1px black" @change="changeSplitStyle" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item :label="$t('chart.shadow')" class="form-item">
|
||||||
|
<el-checkbox v-model="splitForm.splitArea.show" @change="changeSplitStyle">{{ $t('chart.show') }}</el-checkbox>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</el-col>
|
||||||
|
|
||||||
|
<el-button slot="reference" size="mini" class="shape-item">
|
||||||
|
{{ $t('chart.split') }}<i class="el-icon-setting el-icon--right" />
|
||||||
|
</el-button>
|
||||||
|
</el-popover>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { DEFAULT_SPLIT } from '../../chart/chart'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'SplitSelector',
|
||||||
|
props: {
|
||||||
|
chart: {
|
||||||
|
type: Object,
|
||||||
|
required: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
splitForm: JSON.parse(JSON.stringify(DEFAULT_SPLIT)),
|
||||||
|
isSetting: false,
|
||||||
|
fontSize: []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
'chart': {
|
||||||
|
handler: function() {
|
||||||
|
const chart = JSON.parse(JSON.stringify(this.chart))
|
||||||
|
if (chart.customStyle) {
|
||||||
|
let customStyle = null
|
||||||
|
if (Object.prototype.toString.call(chart.customStyle) === '[object Object]') {
|
||||||
|
customStyle = JSON.parse(JSON.stringify(chart.customStyle))
|
||||||
|
} else {
|
||||||
|
customStyle = JSON.parse(chart.customStyle)
|
||||||
|
}
|
||||||
|
if (customStyle.split) {
|
||||||
|
this.splitForm = customStyle.split
|
||||||
|
} else {
|
||||||
|
this.splitForm = JSON.parse(JSON.stringify(DEFAULT_SPLIT))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
this.init()
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
init() {
|
||||||
|
const arr = []
|
||||||
|
for (let i = 6; i <= 40; i = i + 2) {
|
||||||
|
arr.push({
|
||||||
|
name: i + '',
|
||||||
|
value: i + ''
|
||||||
|
})
|
||||||
|
}
|
||||||
|
this.fontSize = arr
|
||||||
|
},
|
||||||
|
changeSplitStyle() {
|
||||||
|
if (!this.splitForm.show) {
|
||||||
|
this.isSetting = false
|
||||||
|
}
|
||||||
|
this.$emit('onChangeSplitForm', this.splitForm)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.el-divider--horizontal {
|
||||||
|
margin: 10px 0
|
||||||
|
}
|
||||||
|
.shape-item{
|
||||||
|
padding: 6px;
|
||||||
|
border: none;
|
||||||
|
width: 100%;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
.form-item-slider>>>.el-form-item__label{
|
||||||
|
font-size: 12px;
|
||||||
|
line-height: 38px;
|
||||||
|
}
|
||||||
|
.form-item>>>.el-form-item__label{
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
.el-select-dropdown__item{
|
||||||
|
padding: 0 20px;
|
||||||
|
}
|
||||||
|
span{
|
||||||
|
font-size: 12px
|
||||||
|
}
|
||||||
|
.el-form-item{
|
||||||
|
margin-bottom: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.switch-style{
|
||||||
|
position: absolute;
|
||||||
|
right: 10px;
|
||||||
|
margin-top: -4px;
|
||||||
|
}
|
||||||
|
</style>
|
@ -23,7 +23,7 @@
|
|||||||
</el-select>
|
</el-select>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="6">
|
<el-col :span="6">
|
||||||
<el-input v-show="!f.term.includes('null')" v-model="f.value" class="value-item" :placeholder="$t('chart.no_limit')" size="mini" clearable />
|
<el-input v-show="!f.term.includes('null')" v-model="f.value" class="value-item" :placeholder="$t('chart.condition')" size="mini" clearable />
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="6">
|
<el-col :span="6">
|
||||||
<el-button type="text" icon="el-icon-delete" circle style="float: right" @click="removeFilter(index)" />
|
<el-button type="text" icon="el-icon-delete" circle style="float: right" @click="removeFilter(index)" />
|
||||||
@ -53,7 +53,18 @@ export default {
|
|||||||
value: 'not_eq',
|
value: 'not_eq',
|
||||||
label: this.$t('chart.filter_not_eq')
|
label: this.$t('chart.filter_not_eq')
|
||||||
}]
|
}]
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
|
label: '',
|
||||||
|
options: [{
|
||||||
|
value: 'like',
|
||||||
|
label: this.$t('chart.filter_like')
|
||||||
|
}, {
|
||||||
|
value: 'not like',
|
||||||
|
label: this.$t('chart.filter_not_like')
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
{
|
||||||
label: '',
|
label: '',
|
||||||
options: [{
|
options: [{
|
||||||
value: 'lt',
|
value: 'lt',
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
</el-select>
|
</el-select>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="6">
|
<el-col :span="6">
|
||||||
<el-input v-show="!f.term.includes('null')" v-model="f.value" class="value-item" :placeholder="$t('chart.no_limit')" size="mini" clearable />
|
<el-input v-show="!f.term.includes('null')" v-model="f.value" class="value-item" :placeholder="$t('chart.condition')" size="mini" clearable />
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="6">
|
<el-col :span="6">
|
||||||
<el-button type="text" icon="el-icon-delete" circle style="float: right" @click="removeFilter(index)" />
|
<el-button type="text" icon="el-icon-delete" circle style="float: right" @click="removeFilter(index)" />
|
||||||
@ -53,7 +53,18 @@ export default {
|
|||||||
value: 'not_eq',
|
value: 'not_eq',
|
||||||
label: this.$t('chart.filter_not_eq')
|
label: this.$t('chart.filter_not_eq')
|
||||||
}]
|
}]
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
|
label: '',
|
||||||
|
options: [{
|
||||||
|
value: 'like',
|
||||||
|
label: this.$t('chart.filter_like')
|
||||||
|
}, {
|
||||||
|
value: 'not like',
|
||||||
|
label: this.$t('chart.filter_not_like')
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
{
|
||||||
label: '',
|
label: '',
|
||||||
options: [{
|
options: [{
|
||||||
value: 'lt',
|
value: 'lt',
|
||||||
|
@ -37,7 +37,7 @@
|
|||||||
</el-select>
|
</el-select>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="6">
|
<el-col :span="6">
|
||||||
<el-input v-show="!f.term.includes('null')" v-model="f.value" class="value-item" :placeholder="$t('chart.no_limit')" size="mini" clearable />
|
<el-input v-show="!f.term.includes('null')" v-model="f.value" class="value-item" :placeholder="$t('chart.condition')" size="mini" clearable />
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="6">
|
<el-col :span="6">
|
||||||
<el-button type="text" icon="el-icon-delete" circle style="float: right" @click="removeFilter(index)" />
|
<el-button type="text" icon="el-icon-delete" circle style="float: right" @click="removeFilter(index)" />
|
||||||
@ -69,7 +69,18 @@ export default {
|
|||||||
value: 'not_eq',
|
value: 'not_eq',
|
||||||
label: this.$t('chart.filter_not_eq')
|
label: this.$t('chart.filter_not_eq')
|
||||||
}]
|
}]
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
|
label: '',
|
||||||
|
options: [{
|
||||||
|
value: 'like',
|
||||||
|
label: this.$t('chart.filter_like')
|
||||||
|
}, {
|
||||||
|
value: 'not like',
|
||||||
|
label: this.$t('chart.filter_not_like')
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
{
|
||||||
label: '',
|
label: '',
|
||||||
options: [{
|
options: [{
|
||||||
value: 'lt',
|
value: 'lt',
|
||||||
|
@ -34,7 +34,7 @@
|
|||||||
<span>{{ $t('chart.content_formatter') }}</span>
|
<span>{{ $t('chart.content_formatter') }}</span>
|
||||||
<el-tooltip class="item" effect="dark" placement="bottom">
|
<el-tooltip class="item" effect="dark" placement="bottom">
|
||||||
<div slot="content">
|
<div slot="content">
|
||||||
字符串支持用 \n 换行<br>字符串模板 模板变量有:<br>{a}:系列名。<br>{b}:数据名。<br>{c}:数据值。<br>{d}:百分比(用于饼图等)。
|
字符串模板 模板变量有:<br>{a}:系列名。<br>{b}:数据名。<br>{c}:数据值。<br>{d}:百分比(用于饼图等)。
|
||||||
</div>
|
</div>
|
||||||
<i class="el-icon-info" style="cursor: pointer;" />
|
<i class="el-icon-info" style="cursor: pointer;" />
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
|
@ -353,7 +353,8 @@ import {
|
|||||||
DEFAULT_TOOLTIP,
|
DEFAULT_TOOLTIP,
|
||||||
DEFAULT_XAXIS_STYLE,
|
DEFAULT_XAXIS_STYLE,
|
||||||
DEFAULT_YAXIS_STYLE,
|
DEFAULT_YAXIS_STYLE,
|
||||||
DEFAULT_BACKGROUND_COLOR
|
DEFAULT_BACKGROUND_COLOR,
|
||||||
|
DEFAULT_SPLIT
|
||||||
} from '../chart/chart'
|
} from '../chart/chart'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@ -781,7 +782,8 @@ export default {
|
|||||||
legend: DEFAULT_LEGEND_STYLE,
|
legend: DEFAULT_LEGEND_STYLE,
|
||||||
xAxis: DEFAULT_XAXIS_STYLE,
|
xAxis: DEFAULT_XAXIS_STYLE,
|
||||||
yAxis: DEFAULT_YAXIS_STYLE,
|
yAxis: DEFAULT_YAXIS_STYLE,
|
||||||
background: DEFAULT_BACKGROUND_COLOR
|
background: DEFAULT_BACKGROUND_COLOR,
|
||||||
|
split: DEFAULT_SPLIT
|
||||||
})
|
})
|
||||||
view.customFilter = JSON.stringify([])
|
view.customFilter = JSON.stringify([])
|
||||||
post('/chart/view/save', view).then(response => {
|
post('/chart/view/save', view).then(response => {
|
||||||
|
@ -29,10 +29,20 @@
|
|||||||
<el-col
|
<el-col
|
||||||
style="height: 100%;width: 20%;min-width: 180px;max-width:220px;border: 1px solid #E6E6E6;border-left: 0 solid;"
|
style="height: 100%;width: 20%;min-width: 180px;max-width:220px;border: 1px solid #E6E6E6;border-left: 0 solid;"
|
||||||
>
|
>
|
||||||
<div style="height: 50%;border-bottom: 1px solid #E6E6E6;" class="padding-lr">
|
<div style="display: flex;align-items: center;justify-content: center;padding: 6px;">
|
||||||
|
<el-input
|
||||||
|
v-model="searchField"
|
||||||
|
size="mini"
|
||||||
|
:placeholder="$t('chart.search')"
|
||||||
|
prefix-icon="el-icon-search"
|
||||||
|
clearable
|
||||||
|
/>
|
||||||
|
<el-button icon="el-icon-setting" type="text" size="mini" style="float: right;width: 20px;margin-left: 6px;" @click="editField" />
|
||||||
|
</div>
|
||||||
|
<div style="border-bottom: 1px solid #E6E6E6;" class="padding-lr field-height">
|
||||||
<span>{{ $t('chart.dimension') }}</span>
|
<span>{{ $t('chart.dimension') }}</span>
|
||||||
<draggable
|
<draggable
|
||||||
v-model="dimension"
|
v-model="dimensionData"
|
||||||
:options="{group:{name: 'dimension',pull:'clone'},sort: true}"
|
:options="{group:{name: 'dimension',pull:'clone'},sort: true}"
|
||||||
animation="300"
|
animation="300"
|
||||||
:move="onMove"
|
:move="onMove"
|
||||||
@ -41,7 +51,7 @@
|
|||||||
@start="start1"
|
@start="start1"
|
||||||
>
|
>
|
||||||
<transition-group>
|
<transition-group>
|
||||||
<span v-for="item in dimension" :key="item.id" class="item" :title="item.name">
|
<span v-for="item in dimensionData" :key="item.id" class="item" :title="item.name">
|
||||||
<svg-icon v-if="item.deType === 0" icon-class="field_text" class="field-icon-text" />
|
<svg-icon v-if="item.deType === 0" icon-class="field_text" class="field-icon-text" />
|
||||||
<svg-icon v-if="item.deType === 1" icon-class="field_time" class="field-icon-time" />
|
<svg-icon v-if="item.deType === 1" icon-class="field_time" class="field-icon-time" />
|
||||||
<svg-icon v-if="item.deType === 2 || item.deType === 3" icon-class="field_value" class="field-icon-value" />
|
<svg-icon v-if="item.deType === 2 || item.deType === 3" icon-class="field_value" class="field-icon-value" />
|
||||||
@ -50,10 +60,10 @@
|
|||||||
</transition-group>
|
</transition-group>
|
||||||
</draggable>
|
</draggable>
|
||||||
</div>
|
</div>
|
||||||
<div style="height: 50%;" class="padding-lr">
|
<div class="padding-lr field-height">
|
||||||
<span>{{ $t('chart.quota') }}</span>
|
<span>{{ $t('chart.quota') }}</span>
|
||||||
<draggable
|
<draggable
|
||||||
v-model="quota"
|
v-model="quotaData"
|
||||||
:options="{group:{name: 'quota',pull:'clone'},sort: true}"
|
:options="{group:{name: 'quota',pull:'clone'},sort: true}"
|
||||||
animation="300"
|
animation="300"
|
||||||
:move="onMove"
|
:move="onMove"
|
||||||
@ -62,7 +72,7 @@
|
|||||||
@start="start1"
|
@start="start1"
|
||||||
>
|
>
|
||||||
<transition-group>
|
<transition-group>
|
||||||
<span v-for="item in quota" :key="item.id" class="item" :title="item.name">
|
<span v-for="item in quotaData" :key="item.id" class="item" :title="item.name">
|
||||||
<svg-icon v-if="item.deType === 0" icon-class="field_text" class="field-icon-text" />
|
<svg-icon v-if="item.deType === 0" icon-class="field_text" class="field-icon-text" />
|
||||||
<svg-icon v-if="item.deType === 1" icon-class="field_time" class="field-icon-time" />
|
<svg-icon v-if="item.deType === 1" icon-class="field_time" class="field-icon-time" />
|
||||||
<svg-icon v-if="item.deType === 2 || item.deType === 3" icon-class="field_value" class="field-icon-value" />
|
<svg-icon v-if="item.deType === 2 || item.deType === 3" icon-class="field_value" class="field-icon-value" />
|
||||||
@ -213,6 +223,7 @@
|
|||||||
<el-tab-pane :label="$t('chart.module_style')" class="padding-lr">
|
<el-tab-pane :label="$t('chart.module_style')" class="padding-lr">
|
||||||
<x-axis-selector v-show="view.type.includes('bar') || view.type.includes('line')" class="attr-selector" :chart="chart" @onChangeXAxisForm="onChangeXAxisForm" />
|
<x-axis-selector v-show="view.type.includes('bar') || view.type.includes('line')" class="attr-selector" :chart="chart" @onChangeXAxisForm="onChangeXAxisForm" />
|
||||||
<y-axis-selector v-show="view.type.includes('bar') || view.type.includes('line')" class="attr-selector" :chart="chart" @onChangeYAxisForm="onChangeYAxisForm" />
|
<y-axis-selector v-show="view.type.includes('bar') || view.type.includes('line')" class="attr-selector" :chart="chart" @onChangeYAxisForm="onChangeYAxisForm" />
|
||||||
|
<split-selector v-show="view.type.includes('radar')" class="attr-selector" :chart="chart" @onChangeSplitForm="onChangeSplitForm" />
|
||||||
<title-selector class="attr-selector" :chart="chart" @onTextChange="onTextChange" />
|
<title-selector class="attr-selector" :chart="chart" @onTextChange="onTextChange" />
|
||||||
<legend-selector v-show="!view.type.includes('table') && !view.type.includes('text')" class="attr-selector" :chart="chart" @onLegendChange="onLegendChange" />
|
<legend-selector v-show="!view.type.includes('table') && !view.type.includes('text')" class="attr-selector" :chart="chart" @onLegendChange="onLegendChange" />
|
||||||
<background-color-selector class="attr-selector" :chart="chart" @onChangeBackgroundForm="onChangeBackgroundForm" />
|
<background-color-selector class="attr-selector" :chart="chart" @onChangeBackgroundForm="onChangeBackgroundForm" />
|
||||||
@ -351,6 +362,18 @@
|
|||||||
<el-button type="primary" size="mini" :disabled="!table.id" @click="changeChart">{{ $t('chart.confirm') }}</el-button>
|
<el-button type="primary" size="mini" :disabled="!table.id" @click="changeChart">{{ $t('chart.confirm') }}</el-button>
|
||||||
</div>
|
</div>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
|
|
||||||
|
<!--编辑视图使用的数据集的字段-->
|
||||||
|
<el-dialog
|
||||||
|
v-dialogDrag
|
||||||
|
:visible="editDsField"
|
||||||
|
:show-close="false"
|
||||||
|
class="dialog-css"
|
||||||
|
:destroy-on-close="true"
|
||||||
|
:fullscreen="true"
|
||||||
|
>
|
||||||
|
<field-edit :param="{table:table}" @switchComponent="closeEditDsField" />
|
||||||
|
</el-dialog>
|
||||||
</el-row>
|
</el-row>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -373,7 +396,8 @@ import {
|
|||||||
DEFAULT_TITLE_STYLE,
|
DEFAULT_TITLE_STYLE,
|
||||||
DEFAULT_TOOLTIP,
|
DEFAULT_TOOLTIP,
|
||||||
DEFAULT_XAXIS_STYLE,
|
DEFAULT_XAXIS_STYLE,
|
||||||
DEFAULT_YAXIS_STYLE
|
DEFAULT_YAXIS_STYLE,
|
||||||
|
DEFAULT_SPLIT
|
||||||
} from '../chart/chart'
|
} from '../chart/chart'
|
||||||
import ColorSelector from '../components/shape-attr/ColorSelector'
|
import ColorSelector from '../components/shape-attr/ColorSelector'
|
||||||
import SizeSelector from '../components/shape-attr/SizeSelector'
|
import SizeSelector from '../components/shape-attr/SizeSelector'
|
||||||
@ -384,16 +408,18 @@ import TooltipSelector from '../components/shape-attr/TooltipSelector'
|
|||||||
import XAxisSelector from '../components/component-style/XAxisSelector'
|
import XAxisSelector from '../components/component-style/XAxisSelector'
|
||||||
import YAxisSelector from '../components/component-style/YAxisSelector'
|
import YAxisSelector from '../components/component-style/YAxisSelector'
|
||||||
import BackgroundColorSelector from '../components/component-style/BackgroundColorSelector'
|
import BackgroundColorSelector from '../components/component-style/BackgroundColorSelector'
|
||||||
|
import SplitSelector from '../components/component-style/SplitSelector'
|
||||||
import QuotaFilterEditor from '../components/filter/QuotaFilterEditor'
|
import QuotaFilterEditor from '../components/filter/QuotaFilterEditor'
|
||||||
import DimensionFilterEditor from '../components/filter/DimensionFilterEditor'
|
import DimensionFilterEditor from '../components/filter/DimensionFilterEditor'
|
||||||
import TableNormal from '../components/table/TableNormal'
|
import TableNormal from '../components/table/TableNormal'
|
||||||
import LabelNormal from '../components/normal/LabelNormal'
|
import LabelNormal from '../components/normal/LabelNormal'
|
||||||
import html2canvas from 'html2canvas'
|
import html2canvas from 'html2canvas'
|
||||||
import TableSelector from './TableSelector'
|
import TableSelector from './TableSelector'
|
||||||
|
import FieldEdit from '../../dataset/data/FieldEdit'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'ChartEdit',
|
name: 'ChartEdit',
|
||||||
components: { TableSelector, ResultFilterEditor, LabelNormal, DimensionFilterEditor, TableNormal, DatasetChartDetail, QuotaFilterEditor, BackgroundColorSelector, XAxisSelector, YAxisSelector, TooltipSelector, LabelSelector, LegendSelector, TitleSelector, SizeSelector, ColorSelector, ChartComponent, QuotaItem, DimensionItem, draggable },
|
components: { FieldEdit, SplitSelector, TableSelector, ResultFilterEditor, LabelNormal, DimensionFilterEditor, TableNormal, DatasetChartDetail, QuotaFilterEditor, BackgroundColorSelector, XAxisSelector, YAxisSelector, TooltipSelector, LabelSelector, LegendSelector, TitleSelector, SizeSelector, ColorSelector, ChartComponent, QuotaItem, DimensionItem, draggable },
|
||||||
props: {
|
props: {
|
||||||
param: {
|
param: {
|
||||||
type: Object,
|
type: Object,
|
||||||
@ -406,6 +432,8 @@ export default {
|
|||||||
table: {},
|
table: {},
|
||||||
dimension: [],
|
dimension: [],
|
||||||
quota: [],
|
quota: [],
|
||||||
|
dimensionData: [],
|
||||||
|
quotaData: [],
|
||||||
view: {
|
view: {
|
||||||
xaxis: [],
|
xaxis: [],
|
||||||
yaxis: [],
|
yaxis: [],
|
||||||
@ -423,7 +451,8 @@ export default {
|
|||||||
legend: DEFAULT_LEGEND_STYLE,
|
legend: DEFAULT_LEGEND_STYLE,
|
||||||
xAxis: DEFAULT_XAXIS_STYLE,
|
xAxis: DEFAULT_XAXIS_STYLE,
|
||||||
yAxis: DEFAULT_YAXIS_STYLE,
|
yAxis: DEFAULT_YAXIS_STYLE,
|
||||||
background: DEFAULT_BACKGROUND_COLOR
|
background: DEFAULT_BACKGROUND_COLOR,
|
||||||
|
split: DEFAULT_SPLIT
|
||||||
},
|
},
|
||||||
customFilter: []
|
customFilter: []
|
||||||
},
|
},
|
||||||
@ -454,7 +483,9 @@ export default {
|
|||||||
msg: ''
|
msg: ''
|
||||||
},
|
},
|
||||||
selectTableFlag: false,
|
selectTableFlag: false,
|
||||||
changeTable: {}
|
changeTable: {},
|
||||||
|
searchField: '',
|
||||||
|
editDsField: false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
@ -463,7 +494,6 @@ export default {
|
|||||||
// this.getData(this.$store.state.chart.viewId)
|
// this.getData(this.$store.state.chart.viewId)
|
||||||
// return this.$store.state.chart.viewId
|
// return this.$store.state.chart.viewId
|
||||||
// }
|
// }
|
||||||
|
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
'param': function() {
|
'param': function() {
|
||||||
@ -472,6 +502,9 @@ export default {
|
|||||||
}else{
|
}else{
|
||||||
this.getData(this.param.id)
|
this.getData(this.param.id)
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
searchField(val) {
|
||||||
|
this.fieldFilter(val)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
@ -503,6 +536,9 @@ export default {
|
|||||||
post('/dataset/table/getFieldsFromDE', this.table).then(response => {
|
post('/dataset/table/getFieldsFromDE', this.table).then(response => {
|
||||||
this.dimension = response.data.dimension
|
this.dimension = response.data.dimension
|
||||||
this.quota = response.data.quota
|
this.quota = response.data.quota
|
||||||
|
this.dimensionData = JSON.parse(JSON.stringify(this.dimension))
|
||||||
|
this.quotaData = JSON.parse(JSON.stringify(this.quota))
|
||||||
|
this.fieldFilter(this.searchField)
|
||||||
}).catch(err => {
|
}).catch(err => {
|
||||||
this.resetView()
|
this.resetView()
|
||||||
this.httpRequest.status = err.response.data.success
|
this.httpRequest.status = err.response.data.success
|
||||||
@ -865,6 +901,11 @@ export default {
|
|||||||
this.save()
|
this.save()
|
||||||
},
|
},
|
||||||
|
|
||||||
|
onChangeSplitForm(val) {
|
||||||
|
this.view.customStyle.split = val
|
||||||
|
this.save()
|
||||||
|
},
|
||||||
|
|
||||||
showDimensionEditFilter(item) {
|
showDimensionEditFilter(item) {
|
||||||
this.dimensionItem = JSON.parse(JSON.stringify(item))
|
this.dimensionItem = JSON.parse(JSON.stringify(item))
|
||||||
this.dimensionFilterEdit = true
|
this.dimensionFilterEdit = true
|
||||||
@ -873,6 +914,17 @@ export default {
|
|||||||
this.dimensionFilterEdit = false
|
this.dimensionFilterEdit = false
|
||||||
},
|
},
|
||||||
saveDimensionFilter() {
|
saveDimensionFilter() {
|
||||||
|
for (let i = 0; i < this.dimensionItem.filter.length; i++) {
|
||||||
|
const f = this.dimensionItem.filter[i]
|
||||||
|
if (!f.term.includes('null') && (!f.value || f.value === '')) {
|
||||||
|
this.$message({
|
||||||
|
message: this.$t('chart.filter_value_can_null'),
|
||||||
|
type: 'error',
|
||||||
|
showClose: true
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
this.view.xaxis[this.dimensionItem.index].filter = this.dimensionItem.filter
|
this.view.xaxis[this.dimensionItem.index].filter = this.dimensionItem.filter
|
||||||
this.save(true)
|
this.save(true)
|
||||||
this.closeDimensionFilter()
|
this.closeDimensionFilter()
|
||||||
@ -886,6 +938,17 @@ export default {
|
|||||||
this.quotaFilterEdit = false
|
this.quotaFilterEdit = false
|
||||||
},
|
},
|
||||||
saveQuotaFilter() {
|
saveQuotaFilter() {
|
||||||
|
for (let i = 0; i < this.quotaItem.filter.length; i++) {
|
||||||
|
const f = this.quotaItem.filter[i]
|
||||||
|
if (!f.term.includes('null') && (!f.value || f.value === '')) {
|
||||||
|
this.$message({
|
||||||
|
message: this.$t('chart.filter_value_can_null'),
|
||||||
|
type: 'error',
|
||||||
|
showClose: true
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
this.view.yaxis[this.quotaItem.index].filter = this.quotaItem.filter
|
this.view.yaxis[this.quotaItem.index].filter = this.quotaItem.filter
|
||||||
this.save(true)
|
this.save(true)
|
||||||
this.closeQuotaFilter()
|
this.closeQuotaFilter()
|
||||||
@ -909,6 +972,14 @@ export default {
|
|||||||
})
|
})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if (!f.term.includes('null') && (!f.value || f.value === '')) {
|
||||||
|
this.$message({
|
||||||
|
message: this.$t('chart.filter_value_can_null'),
|
||||||
|
type: 'error',
|
||||||
|
showClose: true
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
}
|
}
|
||||||
this.view.customFilter = this.chartForFilter.customFilter
|
this.view.customFilter = this.chartForFilter.customFilter
|
||||||
this.save(true)
|
this.save(true)
|
||||||
@ -980,6 +1051,25 @@ export default {
|
|||||||
this.view.yaxis = []
|
this.view.yaxis = []
|
||||||
this.view.customFilter = []
|
this.view.customFilter = []
|
||||||
this.save(true, 'chart', false)
|
this.save(true, 'chart', false)
|
||||||
|
},
|
||||||
|
|
||||||
|
fieldFilter(val) {
|
||||||
|
if (val && val !== '') {
|
||||||
|
this.dimensionData = JSON.parse(JSON.stringify(this.dimension.filter(ele => { return ele.name.includes(val) })))
|
||||||
|
this.quotaData = JSON.parse(JSON.stringify(this.quota.filter(ele => { return ele.name.includes(val) })))
|
||||||
|
} else {
|
||||||
|
this.dimensionData = JSON.parse(JSON.stringify(this.dimension))
|
||||||
|
this.quotaData = JSON.parse(JSON.stringify(this.quota))
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
editField() {
|
||||||
|
this.editDsField = true
|
||||||
|
},
|
||||||
|
|
||||||
|
closeEditDsField() {
|
||||||
|
this.editDsField = false
|
||||||
|
this.initTableField()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1173,4 +1263,7 @@ export default {
|
|||||||
justify-content: center;
|
justify-content: center;
|
||||||
background-color: #ece7e7;
|
background-color: #ece7e7;
|
||||||
}
|
}
|
||||||
|
.field-height{
|
||||||
|
height: calc(50% - 20px);
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<el-row style="height: 100%;overflow-y: hidden;width: 100%;">
|
<el-row style="height: 100%;overflow-y: hidden;width: 100%;">
|
||||||
<span v-show="false">{{ tableRefresh }}</span>
|
<!-- <span v-show="false">{{ tableRefresh }}</span>-->
|
||||||
<el-row style="height: 26px;">
|
<el-row style="height: 26px;">
|
||||||
<el-popover
|
<el-popover
|
||||||
placement="right-start"
|
placement="right-start"
|
||||||
@ -94,10 +94,10 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
tableRefresh() {
|
// tableRefresh() {
|
||||||
this.initTable(this.param)
|
// this.initTable(this.param)
|
||||||
return this.$store.state.dataset.table
|
// return this.$store.state.dataset.table
|
||||||
}
|
// }
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
'param': function() {
|
'param': function() {
|
||||||
|
@ -26,7 +26,7 @@ import AddExcel from './add/AddExcel'
|
|||||||
import AddCustom from './add/AddCustom'
|
import AddCustom from './add/AddCustom'
|
||||||
import FieldEdit from './data/FieldEdit'
|
import FieldEdit from './data/FieldEdit'
|
||||||
import { removeClass } from '@/utils'
|
import { removeClass } from '@/utils'
|
||||||
|
import bus from '@/utils/bus'
|
||||||
export default {
|
export default {
|
||||||
name: 'DataSet',
|
name: 'DataSet',
|
||||||
components: { DeMainContainer, DeContainer, DeAsideContainer, Group, DataHome, ViewTable, AddDB, AddSQL, AddExcel, AddCustom },
|
components: { DeMainContainer, DeContainer, DeAsideContainer, Group, DataHome, ViewTable, AddDB, AddSQL, AddExcel, AddCustom },
|
||||||
@ -39,27 +39,31 @@ export default {
|
|||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
removeClass(document.body, 'showRightPanel')
|
removeClass(document.body, 'showRightPanel')
|
||||||
|
bus.$on('to-msg-dataset', params => {
|
||||||
|
this.toMsgShare(params)
|
||||||
|
})
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
this.$store.dispatch('app/toggleSideBarHide', true)
|
this.$store.dispatch('app/toggleSideBarHide', true)
|
||||||
let routerParam
|
const routerParam = this.$router.currentRoute.params
|
||||||
if ((routerParam = this.$router.currentRoute.params) !== null && routerParam.msgNotification) {
|
this.toMsgShare(routerParam)
|
||||||
// 说明是从消息通知跳转过来的
|
// if ((routerParam = this.$router.currentRoute.params) !== null && routerParam.msgNotification) {
|
||||||
if (routerParam.msgType === 1) { // 是数据集同步
|
// // 说明是从消息通知跳转过来的
|
||||||
if (routerParam.sourceParam) {
|
// if (routerParam.msgType === 1) { // 是数据集同步
|
||||||
try {
|
// if (routerParam.sourceParam) {
|
||||||
const msgParam = JSON.parse(routerParam.sourceParam)
|
// try {
|
||||||
this.param = msgParam.tableId
|
// const msgParam = JSON.parse(routerParam.sourceParam)
|
||||||
this.component = ViewTable
|
// this.param = msgParam.tableId
|
||||||
this.$nextTick(() => {
|
// this.component = ViewTable
|
||||||
this.$refs.dynamic_component.msg2Current(routerParam.sourceParam)
|
// this.$nextTick(() => {
|
||||||
})
|
// this.$refs.dynamic_component.msg2Current(routerParam.sourceParam)
|
||||||
} catch (error) {
|
// })
|
||||||
console.error(error)
|
// } catch (error) {
|
||||||
}
|
// console.error(error)
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
// }
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
switchComponent(c) {
|
switchComponent(c) {
|
||||||
@ -91,6 +95,26 @@ export default {
|
|||||||
|
|
||||||
saveSuccess(val) {
|
saveSuccess(val) {
|
||||||
this.saveStatus = val
|
this.saveStatus = val
|
||||||
|
},
|
||||||
|
|
||||||
|
toMsgShare(routerParam) {
|
||||||
|
if (routerParam !== null && routerParam.msgNotification) {
|
||||||
|
// 说明是从消息通知跳转过来的
|
||||||
|
if (routerParam.msgType === 1) { // 是数据集同步
|
||||||
|
if (routerParam.sourceParam) {
|
||||||
|
try {
|
||||||
|
const msgParam = JSON.parse(routerParam.sourceParam)
|
||||||
|
this.param = msgParam.tableId
|
||||||
|
this.component = ViewTable
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.$refs.dynamic_component.msg2Current(routerParam.sourceParam)
|
||||||
|
})
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -11,10 +11,11 @@
|
|||||||
:pagination-config="paginationConfig"
|
:pagination-config="paginationConfig"
|
||||||
@select="select"
|
@select="select"
|
||||||
@search="search"
|
@search="search"
|
||||||
|
@sort-change="sortChange"
|
||||||
>
|
>
|
||||||
|
|
||||||
<el-table-column prop="content" :label="$t('commons.name')">
|
<el-table-column prop="content" :label="$t('webmsg.content')">
|
||||||
<template v-slot:default="scope">
|
<template slot-scope="scope">
|
||||||
|
|
||||||
<span style="display: flex;flex: 1;">
|
<span style="display: flex;flex: 1;">
|
||||||
<span>
|
<span>
|
||||||
@ -29,13 +30,13 @@
|
|||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
|
||||||
<el-table-column prop="createTime" :label="$t('commons.create_time')" width="180">
|
<el-table-column prop="createTime" sortable="custom" :label="$t('webmsg.sned_time')" width="180">
|
||||||
<template v-slot:default="scope">
|
<template slot-scope="scope">
|
||||||
<span>{{ scope.row.createTime | timestampFormatDate }}</span>
|
<span>{{ scope.row.createTime | timestampFormatDate }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
|
||||||
<el-table-column prop="type" :label="$t('datasource.type')" width="120">
|
<el-table-column prop="type" sortable="custom" :label="$t('webmsg.type')" width="120">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<span>{{ $t(getTypeName(scope.row.type)) }}</span>
|
<span>{{ $t(getTypeName(scope.row.type)) }}</span>
|
||||||
</template>
|
</template>
|
||||||
@ -52,6 +53,8 @@ import LayoutContent from '@/components/business/LayoutContent'
|
|||||||
import ComplexTable from '@/components/business/complex-table'
|
import ComplexTable from '@/components/business/complex-table'
|
||||||
import { query, updateStatus } from '@/api/system/msg'
|
import { query, updateStatus } from '@/api/system/msg'
|
||||||
import { msgTypes, getTypeName } from '@/utils/webMsg'
|
import { msgTypes, getTypeName } from '@/utils/webMsg'
|
||||||
|
import bus from '@/utils/bus'
|
||||||
|
import { addOrder, formatOrders } from '@/utils/index'
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
LayoutContent,
|
LayoutContent,
|
||||||
@ -75,7 +78,8 @@ export default {
|
|||||||
currentPage: 1,
|
currentPage: 1,
|
||||||
pageSize: 10,
|
pageSize: 10,
|
||||||
total: 0
|
total: 0
|
||||||
}
|
},
|
||||||
|
orderConditions: []
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
@ -91,6 +95,13 @@ export default {
|
|||||||
if (this.selectType >= 0) {
|
if (this.selectType >= 0) {
|
||||||
param.type = this.selectType
|
param.type = this.selectType
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this.orderConditions.length === 0) {
|
||||||
|
param.orders = [' status asc ', 'create_time desc ']
|
||||||
|
} else {
|
||||||
|
param.orders = formatOrders(this.orderConditions)
|
||||||
|
}
|
||||||
|
|
||||||
const { currentPage, pageSize } = this.paginationConfig
|
const { currentPage, pageSize } = this.paginationConfig
|
||||||
query(currentPage, pageSize, param).then(response => {
|
query(currentPage, pageSize, param).then(response => {
|
||||||
this.data = response.data.listObject
|
this.data = response.data.listObject
|
||||||
@ -106,13 +117,26 @@ export default {
|
|||||||
toDetail(row) {
|
toDetail(row) {
|
||||||
const param = { ...{ msgNotification: true, msgType: row.type, sourceParam: row.param }}
|
const param = { ...{ msgNotification: true, msgType: row.type, sourceParam: row.param }}
|
||||||
this.$router.push({ name: row.router, params: param })
|
this.$router.push({ name: row.router, params: param })
|
||||||
this.setReaded(row)
|
row.status || this.setReaded(row)
|
||||||
},
|
},
|
||||||
// 设置已读
|
// 设置已读
|
||||||
setReaded(row) {
|
setReaded(row) {
|
||||||
updateStatus(row.msgId).then(res => {
|
updateStatus(row.msgId).then(res => {
|
||||||
|
bus.$emit('refresh-top-notification')
|
||||||
this.search()
|
this.search()
|
||||||
})
|
})
|
||||||
|
},
|
||||||
|
sortChange({ column, prop, order }) {
|
||||||
|
this.orderConditions = []
|
||||||
|
if (!order) {
|
||||||
|
this.search()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (prop === 'createTime') {
|
||||||
|
prop = 'create_time'
|
||||||
|
}
|
||||||
|
addOrder({ field: prop, value: order }, this.orderConditions)
|
||||||
|
this.search()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,10 +11,11 @@
|
|||||||
:pagination-config="paginationConfig"
|
:pagination-config="paginationConfig"
|
||||||
@select="select"
|
@select="select"
|
||||||
@search="search"
|
@search="search"
|
||||||
|
@sort-change="sortChange"
|
||||||
>
|
>
|
||||||
|
|
||||||
<el-table-column prop="content" :label="$t('commons.name')">
|
<el-table-column prop="content" :label="$t('webmsg.content')">
|
||||||
<template v-slot:default="scope">
|
<template slot-scope="scope">
|
||||||
|
|
||||||
<span style="display: flex;flex: 1;">
|
<span style="display: flex;flex: 1;">
|
||||||
<span>
|
<span>
|
||||||
@ -29,13 +30,19 @@
|
|||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
|
||||||
<el-table-column prop="createTime" :label="$t('commons.create_time')" width="180">
|
<el-table-column prop="createTime" sortable="custom" :label="$t('webmsg.sned_time')" width="180">
|
||||||
<template v-slot:default="scope">
|
<template slot-scope="scope">
|
||||||
<span>{{ scope.row.createTime | timestampFormatDate }}</span>
|
<span>{{ scope.row.createTime | timestampFormatDate }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
|
||||||
<el-table-column prop="type" :label="$t('datasource.type')" width="120">
|
<el-table-column prop="readTime" sortable="custom" :label="$t('webmsg.read_time')" width="180">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<span>{{ scope.row.readTime | timestampFormatDate }}</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
|
||||||
|
<el-table-column prop="type" sortable="custom" :label="$t('webmsg.type')" width="120">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<span>{{ $t(getTypeName(scope.row.type)) }}</span>
|
<span>{{ $t(getTypeName(scope.row.type)) }}</span>
|
||||||
</template>
|
</template>
|
||||||
@ -52,6 +59,7 @@ import LayoutContent from '@/components/business/LayoutContent'
|
|||||||
import ComplexTable from '@/components/business/complex-table'
|
import ComplexTable from '@/components/business/complex-table'
|
||||||
import { query } from '@/api/system/msg'
|
import { query } from '@/api/system/msg'
|
||||||
import { msgTypes, getTypeName } from '@/utils/webMsg'
|
import { msgTypes, getTypeName } from '@/utils/webMsg'
|
||||||
|
import { addOrder, formatOrders } from '@/utils/index'
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
LayoutContent,
|
LayoutContent,
|
||||||
@ -70,6 +78,7 @@ export default {
|
|||||||
allTypes: [{ name: 'mysql', type: 'jdbc' }, { name: 'sqlServer', type: 'jdbc' }],
|
allTypes: [{ name: 'mysql', type: 'jdbc' }, { name: 'sqlServer', type: 'jdbc' }],
|
||||||
|
|
||||||
columns: [],
|
columns: [],
|
||||||
|
orderConditions: [],
|
||||||
|
|
||||||
paginationConfig: {
|
paginationConfig: {
|
||||||
currentPage: 1,
|
currentPage: 1,
|
||||||
@ -91,6 +100,13 @@ export default {
|
|||||||
if (this.selectType >= 0) {
|
if (this.selectType >= 0) {
|
||||||
param.type = this.selectType
|
param.type = this.selectType
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this.orderConditions.length === 0) {
|
||||||
|
param.orders = [' create_time desc ']
|
||||||
|
} else {
|
||||||
|
param.orders = formatOrders(this.orderConditions)
|
||||||
|
}
|
||||||
|
|
||||||
const { currentPage, pageSize } = this.paginationConfig
|
const { currentPage, pageSize } = this.paginationConfig
|
||||||
query(currentPage, pageSize, param).then(response => {
|
query(currentPage, pageSize, param).then(response => {
|
||||||
this.data = response.data.listObject
|
this.data = response.data.listObject
|
||||||
@ -106,6 +122,21 @@ export default {
|
|||||||
toDetail(row) {
|
toDetail(row) {
|
||||||
const param = { ...{ msgNotification: true, msgType: row.type, sourceParam: row.param }}
|
const param = { ...{ msgNotification: true, msgType: row.type, sourceParam: row.param }}
|
||||||
this.$router.push({ name: row.router, params: param })
|
this.$router.push({ name: row.router, params: param })
|
||||||
|
},
|
||||||
|
sortChange({ column, prop, order }) {
|
||||||
|
this.orderConditions = []
|
||||||
|
if (!order) {
|
||||||
|
this.search()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (prop === 'createTime') {
|
||||||
|
prop = 'create_time'
|
||||||
|
}
|
||||||
|
if (prop === 'readTime') {
|
||||||
|
prop = 'read_time'
|
||||||
|
}
|
||||||
|
addOrder({ field: prop, value: order }, this.orderConditions)
|
||||||
|
this.search()
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -9,12 +9,22 @@
|
|||||||
:data="data"
|
:data="data"
|
||||||
:columns="columns"
|
:columns="columns"
|
||||||
:pagination-config="paginationConfig"
|
:pagination-config="paginationConfig"
|
||||||
|
:search-config="searchConfig"
|
||||||
@select="select"
|
@select="select"
|
||||||
@search="search"
|
@search="search"
|
||||||
|
@selection-change="handleSelectionChange"
|
||||||
|
@sort-change="sortChange"
|
||||||
>
|
>
|
||||||
|
<template #toolbar>
|
||||||
<el-table-column prop="content" :label="$t('commons.name')">
|
<el-button :disabled="multipleSelection.length === 0" @click="markReaded">{{ $t('webmsg.mark_readed') }}</el-button>
|
||||||
<template v-slot:default="scope">
|
<!-- <fu-table-button v-permission="['user:add']" icon="el-icon-circle-plus-outline" :label="$t('user.create')" @click="create" /> -->
|
||||||
|
</template>
|
||||||
|
<el-table-column
|
||||||
|
type="selection"
|
||||||
|
width="55"
|
||||||
|
/>
|
||||||
|
<el-table-column prop="content" :label="$t('webmsg.content')">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
|
||||||
<span style="display: flex;flex: 1;">
|
<span style="display: flex;flex: 1;">
|
||||||
<span>
|
<span>
|
||||||
@ -29,13 +39,13 @@
|
|||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
|
||||||
<el-table-column prop="createTime" :label="$t('commons.create_time')" width="180">
|
<el-table-column prop="createTime" sortable="custom" :label="$t('webmsg.sned_time')" width="180">
|
||||||
<template v-slot:default="scope">
|
<template slot-scope="scope">
|
||||||
<span>{{ scope.row.createTime | timestampFormatDate }}</span>
|
<span>{{ scope.row.createTime | timestampFormatDate }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
|
||||||
<el-table-column prop="type" :label="$t('datasource.type')" width="120">
|
<el-table-column prop="type" sortable="custom" :label="$t('webmsg.type')" width="120">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<span>{{ $t(getTypeName(scope.row.type)) }}</span>
|
<span>{{ $t(getTypeName(scope.row.type)) }}</span>
|
||||||
</template>
|
</template>
|
||||||
@ -50,8 +60,11 @@
|
|||||||
|
|
||||||
import LayoutContent from '@/components/business/LayoutContent'
|
import LayoutContent from '@/components/business/LayoutContent'
|
||||||
import ComplexTable from '@/components/business/complex-table'
|
import ComplexTable from '@/components/business/complex-table'
|
||||||
import { query, updateStatus } from '@/api/system/msg'
|
import { query, updateStatus, batchRead } from '@/api/system/msg'
|
||||||
import { msgTypes, getTypeName } from '@/utils/webMsg'
|
import { msgTypes, getTypeName } from '@/utils/webMsg'
|
||||||
|
import bus from '@/utils/bus'
|
||||||
|
import { addOrder, formatOrders } from '@/utils/index'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
LayoutContent,
|
LayoutContent,
|
||||||
@ -75,7 +88,13 @@ export default {
|
|||||||
currentPage: 1,
|
currentPage: 1,
|
||||||
pageSize: 10,
|
pageSize: 10,
|
||||||
total: 0
|
total: 0
|
||||||
}
|
},
|
||||||
|
searchConfig: {
|
||||||
|
useQuickSearch: false,
|
||||||
|
useComplexSearch: false
|
||||||
|
},
|
||||||
|
multipleSelection: [],
|
||||||
|
orderConditions: []
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
@ -91,6 +110,13 @@ export default {
|
|||||||
if (this.selectType >= 0) {
|
if (this.selectType >= 0) {
|
||||||
param.type = this.selectType
|
param.type = this.selectType
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this.orderConditions.length === 0) {
|
||||||
|
param.orders = [' create_time desc ']
|
||||||
|
} else {
|
||||||
|
param.orders = formatOrders(this.orderConditions)
|
||||||
|
}
|
||||||
|
|
||||||
const { currentPage, pageSize } = this.paginationConfig
|
const { currentPage, pageSize } = this.paginationConfig
|
||||||
query(currentPage, pageSize, param).then(response => {
|
query(currentPage, pageSize, param).then(response => {
|
||||||
this.data = response.data.listObject
|
this.data = response.data.listObject
|
||||||
@ -111,9 +137,37 @@ export default {
|
|||||||
// 设置已读
|
// 设置已读
|
||||||
setReaded(row) {
|
setReaded(row) {
|
||||||
updateStatus(row.msgId).then(res => {
|
updateStatus(row.msgId).then(res => {
|
||||||
|
bus.$emit('refresh-top-notification')
|
||||||
this.search()
|
this.search()
|
||||||
})
|
})
|
||||||
|
},
|
||||||
|
markReaded() {
|
||||||
|
if (this.multipleSelection.length === 0) {
|
||||||
|
this.$warning(this.$t('webmsg.please_select'))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const param = this.multipleSelection.map(item => item.msgId)
|
||||||
|
batchRead(param).then(res => {
|
||||||
|
this.$success('webmsg.mark_success')
|
||||||
|
this.search()
|
||||||
|
})
|
||||||
|
},
|
||||||
|
handleSelectionChange(val) {
|
||||||
|
this.multipleSelection = val
|
||||||
|
},
|
||||||
|
sortChange({ column, prop, order }) {
|
||||||
|
this.orderConditions = []
|
||||||
|
if (!order) {
|
||||||
|
this.search()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (prop === 'createTime') {
|
||||||
|
prop = 'create_time'
|
||||||
|
}
|
||||||
|
addOrder({ field: prop, value: order }, this.orderConditions)
|
||||||
|
this.search()
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -158,6 +158,12 @@ export default {
|
|||||||
return roots
|
return roots
|
||||||
},
|
},
|
||||||
|
|
||||||
|
getSelected() {
|
||||||
|
return {
|
||||||
|
deptIds: this.$refs.table.store.states.selection.map(item => item.deptId)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
save(msg) {
|
save(msg) {
|
||||||
const rows = this.$refs.table.store.states.selection
|
const rows = this.$refs.table.store.states.selection
|
||||||
const request = this.buildRequest(rows)
|
const request = this.buildRequest(rows)
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
import GrantDept from './dept'
|
import GrantDept from './dept'
|
||||||
import GrantRole from './role'
|
import GrantRole from './role'
|
||||||
import GrantUser from './user'
|
import GrantUser from './user'
|
||||||
|
import { fineSave } from '@/api/panel/share'
|
||||||
export default {
|
export default {
|
||||||
name: 'GrantAuth',
|
name: 'GrantAuth',
|
||||||
components: { GrantDept, GrantRole, GrantUser },
|
components: { GrantDept, GrantRole, GrantUser },
|
||||||
@ -58,8 +59,27 @@ export default {
|
|||||||
this.showSearchInput = false
|
this.showSearchInput = false
|
||||||
},
|
},
|
||||||
save() {
|
save() {
|
||||||
this.$refs[this.activeName].save(this.$t('commons.share_success'))
|
// this.$refs[this.activeName].save(this.$t('commons.share_success'))
|
||||||
this.$emit('close-grant', 0)
|
// this.$emit('close-grant', 0)
|
||||||
|
this.fineSave()
|
||||||
|
},
|
||||||
|
fineSave() {
|
||||||
|
let targetDto = {}
|
||||||
|
this.tabNames.forEach(tabName => {
|
||||||
|
if (this.$refs[tabName] && this.$refs[tabName].getSelected) {
|
||||||
|
const tempSelected = this.$refs[tabName].getSelected()
|
||||||
|
targetDto = Object.assign({}, targetDto, tempSelected)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
const resourceId = this.resourceId
|
||||||
|
const param = {
|
||||||
|
resourceId,
|
||||||
|
authURD: targetDto
|
||||||
|
}
|
||||||
|
fineSave(param).then(res => {
|
||||||
|
this.$success(this.$t('commons.share_success'))
|
||||||
|
this.$emit('close-grant', 0)
|
||||||
|
})
|
||||||
},
|
},
|
||||||
cancel() {
|
cancel() {
|
||||||
this.$refs[this.activeName].cancel()
|
this.$refs[this.activeName].cancel()
|
||||||
|
@ -78,6 +78,13 @@ export default {
|
|||||||
this.setCheckNodes()
|
this.setCheckNodes()
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
|
getSelected() {
|
||||||
|
return {
|
||||||
|
roleIds: this.$refs.table.store.states.selection.map(item => item.roleId)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
save(msg) {
|
save(msg) {
|
||||||
const rows = this.$refs.table.store.states.selection
|
const rows = this.$refs.table.store.states.selection
|
||||||
const request = this.buildRequest(rows)
|
const request = this.buildRequest(rows)
|
||||||
|
@ -71,7 +71,7 @@ export default {
|
|||||||
return data
|
return data
|
||||||
},
|
},
|
||||||
expandMsgNode(panelIds) {
|
expandMsgNode(panelIds) {
|
||||||
console.log(panelIds)
|
// console.log(panelIds)
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
this.getMsgNodes(panelIds)
|
this.getMsgNodes(panelIds)
|
||||||
})
|
})
|
||||||
|
@ -86,6 +86,12 @@ export default {
|
|||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
|
getSelected() {
|
||||||
|
return {
|
||||||
|
userIds: this.$refs.table.store.states.selection.map(item => item.userId)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
save(msg) {
|
save(msg) {
|
||||||
const rows = this.$refs.table.store.states.selection
|
const rows = this.$refs.table.store.states.selection
|
||||||
const request = this.buildRequest(rows)
|
const request = this.buildRequest(rows)
|
||||||
|
@ -27,7 +27,17 @@ export default {
|
|||||||
param: {}
|
param: {}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
watch: {
|
||||||
|
$route(to, from) {
|
||||||
|
console.log(to)
|
||||||
|
console.log(from)
|
||||||
|
// 对路由变化作出响应...
|
||||||
|
}
|
||||||
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
|
bus.$on('to-msg-share', params => {
|
||||||
|
this.toMsgShare(params)
|
||||||
|
})
|
||||||
bus.$on('PanelSwitchComponent', (c) => {
|
bus.$on('PanelSwitchComponent', (c) => {
|
||||||
this.param = c.param
|
this.param = c.param
|
||||||
this.componentName = c.name
|
this.componentName = c.name
|
||||||
@ -50,18 +60,30 @@ export default {
|
|||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
this.$store.dispatch('app/toggleSideBarHide', true)
|
this.$store.dispatch('app/toggleSideBarHide', true)
|
||||||
let routerParam
|
const routerParam = this.$router.currentRoute.params
|
||||||
if ((routerParam = this.$router.currentRoute.params) !== null && routerParam.msgNotification) {
|
// if ((routerParam = this.$router.currentRoute.params) !== null && routerParam.msgNotification) {
|
||||||
// 说明是从消息通知跳转过来的
|
// // 说明是从消息通知跳转过来的
|
||||||
if (routerParam.msgType === 0) { // 是仪表板分享
|
// if (routerParam.msgType === 0) { // 是仪表板分享
|
||||||
this.componentName = 'PanelMain'
|
// this.componentName = 'PanelMain'
|
||||||
this.$nextTick(() => {
|
// this.$nextTick(() => {
|
||||||
this.$refs.panel_main.msg2Current(routerParam.sourceParam)
|
// this.$refs.panel_main.msg2Current(routerParam.sourceParam)
|
||||||
})
|
// })
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
this.toMsgShare(routerParam)
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
toMsgShare(routerParam) {
|
||||||
|
if (routerParam !== null && routerParam.msgNotification) {
|
||||||
|
// 说明是从消息通知跳转过来的
|
||||||
|
if (routerParam.msgType === 0) { // 是仪表板分享
|
||||||
|
this.componentName = 'PanelMain'
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.$refs.panel_main.msg2Current(routerParam.sourceParam)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -114,7 +114,7 @@ export default {
|
|||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.queryTreeDatas()
|
this.queryTreeDatas()
|
||||||
console.log('permis:' + JSON.stringify(this.$store.getters.permissions))
|
// console.log('permis:' + JSON.stringify(this.$store.getters.permissions))
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
filterNode(value, data) {
|
filterNode(value, data) {
|
||||||
@ -154,7 +154,7 @@ export default {
|
|||||||
return 'MySQL'
|
return 'MySQL'
|
||||||
} else if (type === 'sqlServer') {
|
} else if (type === 'sqlServer') {
|
||||||
return 'SQL Server'
|
return 'SQL Server'
|
||||||
}else if (type === 'oracle') {
|
} else if (type === 'oracle') {
|
||||||
return 'Oracle'
|
return 'Oracle'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -46,6 +46,23 @@
|
|||||||
<el-form-item v-if="form.configuration.dataSourceType=='jdbc'" :label="$t('datasource.port')" prop="configuration.port">
|
<el-form-item v-if="form.configuration.dataSourceType=='jdbc'" :label="$t('datasource.port')" prop="configuration.port">
|
||||||
<el-input v-model="form.configuration.port" autocomplete="off" />
|
<el-input v-model="form.configuration.port" autocomplete="off" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
<el-form-item v-if="form.type=='oracle'">
|
||||||
|
<el-button icon="el-icon-plus" size="mini" @click="getSchema()">
|
||||||
|
{{ $t('datasource.get_schema') }}
|
||||||
|
</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
|
<el-form-item v-if="form.type=='oracle'" :label="$t('datasource.schema')">
|
||||||
|
<el-select v-model="form.configuration.schema" :placeholder="$t('datasource.please_choose_schema')" class="select-width" :disabled="formType=='modify'">
|
||||||
|
<el-option
|
||||||
|
v-for="item in schemas"
|
||||||
|
:key="item"
|
||||||
|
:label="item"
|
||||||
|
:value="item"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
</el-form>
|
</el-form>
|
||||||
<div v-if="canEdit" slot="footer" class="dialog-footer">
|
<div v-if="canEdit" slot="footer" class="dialog-footer">
|
||||||
<el-button v-if="formType==='add'?true: hasDataPermission('manage',params.privileges)" @click="validaDatasource">{{ $t('commons.validate') }}</el-button>
|
<el-button v-if="formType==='add'?true: hasDataPermission('manage',params.privileges)" @click="validaDatasource">{{ $t('commons.validate') }}</el-button>
|
||||||
@ -61,7 +78,7 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
import LayoutContent from '@/components/business/LayoutContent'
|
import LayoutContent from '@/components/business/LayoutContent'
|
||||||
import { addDs, editDs, validateDs } from '@/api/system/datasource'
|
import { addDs, editDs, getSchema, validateDs } from '@/api/system/datasource'
|
||||||
export default {
|
export default {
|
||||||
name: 'DsForm',
|
name: 'DsForm',
|
||||||
components: { LayoutContent },
|
components: { LayoutContent },
|
||||||
@ -84,9 +101,11 @@ export default {
|
|||||||
'configuration.username': [{ required: true, message: this.$t('datasource.please_input_user_name'), trigger: 'blur' }],
|
'configuration.username': [{ required: true, message: this.$t('datasource.please_input_user_name'), trigger: 'blur' }],
|
||||||
'configuration.password': [{ required: true, message: this.$t('datasource.please_input_password'), trigger: 'change' }],
|
'configuration.password': [{ required: true, message: this.$t('datasource.please_input_password'), trigger: 'change' }],
|
||||||
'configuration.host': [{ required: true, message: this.$t('datasource.please_input_host'), trigger: 'change' }],
|
'configuration.host': [{ required: true, message: this.$t('datasource.please_input_host'), trigger: 'change' }],
|
||||||
'configuration.port': [{ required: true, message: this.$t('datasource.please_input_port'), trigger: 'change' }]
|
'configuration.port': [{ required: true, message: this.$t('datasource.please_input_port'), trigger: 'change' }],
|
||||||
|
'configuration.schema': [{ required: true, message: this.$t('datasource.please_choose_schema'), trigger: 'change' }]
|
||||||
},
|
},
|
||||||
allTypes: [{ name: 'mysql', label: 'MySQL', type: 'jdbc' }, { name: 'oracle', label: 'Oracle', type: 'jdbc' }],
|
allTypes: [{ name: 'mysql', label: 'MySQL', type: 'jdbc' }, { name: 'oracle', label: 'Oracle', type: 'jdbc' }],
|
||||||
|
schemas: [],
|
||||||
canEdit: false
|
canEdit: false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -129,10 +148,13 @@ export default {
|
|||||||
this.$refs.dsForm.resetFields()
|
this.$refs.dsForm.resetFields()
|
||||||
},
|
},
|
||||||
save() {
|
save() {
|
||||||
|
if (!this.form.configuration.schema) {
|
||||||
|
this.$message.error(this.$t('datasource.please_choose_schema'))
|
||||||
|
return
|
||||||
|
}
|
||||||
this.$refs.dsForm.validate(valid => {
|
this.$refs.dsForm.validate(valid => {
|
||||||
if (valid) {
|
if (valid) {
|
||||||
const method = this.formType === 'add' ? addDs : editDs
|
const method = this.formType === 'add' ? addDs : editDs
|
||||||
// this.form.configuration = JSON.stringify(this.form.configuration)
|
|
||||||
const form = JSON.parse(JSON.stringify(this.form))
|
const form = JSON.parse(JSON.stringify(this.form))
|
||||||
form.configuration = JSON.stringify(form.configuration)
|
form.configuration = JSON.stringify(form.configuration)
|
||||||
method(form).then(res => {
|
method(form).then(res => {
|
||||||
@ -145,12 +167,25 @@ export default {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
getSchema() {
|
||||||
|
this.$refs.dsForm.validate(valid => {
|
||||||
|
if (valid) {
|
||||||
|
const data = JSON.parse(JSON.stringify(this.form))
|
||||||
|
data.configuration = JSON.stringify(data.configuration)
|
||||||
|
getSchema(data).then(res => {
|
||||||
|
this.schemas = res.data
|
||||||
|
this.$success(this.$t('datasource.validate_success'))
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
validaDatasource() {
|
validaDatasource() {
|
||||||
this.$refs.dsForm.validate(valid => {
|
this.$refs.dsForm.validate(valid => {
|
||||||
if (valid) {
|
if (valid) {
|
||||||
const data = JSON.parse(JSON.stringify(this.form))
|
const data = JSON.parse(JSON.stringify(this.form))
|
||||||
data.configuration = JSON.stringify(data.configuration)
|
data.configuration = JSON.stringify(data.configuration)
|
||||||
|
|
||||||
validateDs(data).then(res => {
|
validateDs(data).then(res => {
|
||||||
this.$success(this.$t('datasource.validate_success'))
|
this.$success(this.$t('datasource.validate_success'))
|
||||||
})
|
})
|
||||||
|
Loading…
Reference in New Issue
Block a user