Merge remote-tracking branch 'origin/dev' into pr@dev@panel

# Conflicts:
#	frontend/src/views/chart/view/ChartEdit.vue
This commit is contained in:
wangjiahao 2021-07-06 18:46:54 +08:00
commit c05e4b842d
57 changed files with 1696 additions and 260 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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;
@ -32,4 +33,8 @@ public interface ShareApi {
List<PanelShare> queryWithResourceId(BaseGridRequest request); List<PanelShare> queryWithResourceId(BaseGridRequest request);
@ApiOperation("优化创建分享")
@PostMapping("/fineSave")
void fineSave(PanelShareFineDto panelShareFineDto);
} }

View File

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

View File

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

View File

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

View File

@ -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() {
// 连接参数先写死后边要把编码时区等参数放到数据源的设置中 // 连接参数先写死后边要把编码时区等参数放到数据源的设置中

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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,7 +121,7 @@ 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);
@ -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")) {

View File

@ -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 { } else {
stringBuilder.append(x.getOriginName()); 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 {
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";
}
}
} }

View File

@ -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;
}*/ }*/
// 仪表板有参数不实用缓存
if (CollectionUtils.isNotEmpty(requestList.getFilter())) {
data = datasourceProvider.getData(datasourceRequest);
}else {
try{
data = cacheViewData(datasourceProvider, datasourceRequest, id); 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()) {// 获取锁成功
try{
result = datasourceProvider.getData(datasourceRequest); result = datasourceProvider.getData(datasourceRequest);
if (result != null) { if (result != null) {
CacheUtils.put(JdbcConstants.VIEW_CACHE_KEY, viewId, result, null, 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);

View File

@ -282,6 +282,7 @@ 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")) {
if (datasetTable.getMode() == 0) {
Datasource ds = datasourceMapper.selectByPrimaryKey(dataSetTableRequest.getDataSourceId()); Datasource ds = datasourceMapper.selectByPrimaryKey(dataSetTableRequest.getDataSourceId());
if (ObjectUtils.isEmpty(ds)) { if (ObjectUtils.isEmpty(ds)) {
throw new RuntimeException(Translator.get("i18n_datasource_delete")); throw new RuntimeException(Translator.get("i18n_datasource_delete"));
@ -289,7 +290,6 @@ public class DataSetTableService {
DatasourceProvider datasourceProvider = ProviderFactory.getProvider(ds.getType()); DatasourceProvider datasourceProvider = ProviderFactory.getProvider(ds.getType());
DatasourceRequest datasourceRequest = new DatasourceRequest(); DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setDatasource(ds); datasourceRequest.setDatasource(ds);
String table = dataTableInfoDTO.getTable(); String table = dataTableInfoDTO.getTable();
QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType()); QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType());
datasourceRequest.setQuery(qp.createQuerySQLWithPage(table, fields, page, pageSize, realSize)); datasourceRequest.setQuery(qp.createQuerySQLWithPage(table, fields, page, pageSize, realSize));
@ -304,7 +304,33 @@ public class DataSetTableService {
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); 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(), "sql")) { } else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), "sql")) {
if (datasetTable.getMode() == 0) {
Datasource ds = datasourceMapper.selectByPrimaryKey(dataSetTableRequest.getDataSourceId()); Datasource ds = datasourceMapper.selectByPrimaryKey(dataSetTableRequest.getDataSourceId());
if (ObjectUtils.isEmpty(ds)) { if (ObjectUtils.isEmpty(ds)) {
throw new RuntimeException(Translator.get("i18n_datasource_delete")); throw new RuntimeException(Translator.get("i18n_datasource_delete"));
@ -324,11 +350,34 @@ public class DataSetTableService {
} }
try { try {
datasourceRequest.setQuery(qp.createQuerySqlWithLimit(sql, fields, Integer.valueOf(dataSetTableRequest.getRow()))); datasourceRequest.setQuery(qp.createQuerySqlWithLimit(sql, fields, Integer.valueOf(dataSetTableRequest.getRow())));
System.out.println(datasourceRequest.getQuery());
dataSetPreviewPage.setTotal(datasourceProvider.getData(datasourceRequest).size()); dataSetPreviewPage.setTotal(datasourceProvider.getData(datasourceRequest).size());
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); 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())) {
map.put("status", "warnning"); map.put("status", "warnning");
@ -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);

View File

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

View File

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

View File

@ -17,3 +17,15 @@ CREATE TABLE `sys_msg` (
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;

View File

@ -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 fieldplease fix and upload again. i18n_excel_field_repeat=Excel exists repeat fieldplease 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

View File

@ -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=请先完成数据同步

View File

@ -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=請先完成數據同步

View File

@ -27,3 +27,12 @@ export function loadTree(data) {
}) })
} }
export function fineSave(data) {
return request({
url: '/api/share/fineSave',
method: 'post',
loading: true,
data
})
}

View File

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

View File

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

View File

@ -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)
}, },
methods: { mounted() {
handClick(lang) { bus.$on('refresh-top-notification', () => {
console.log(lang) this.search()
})
}, },
beforeDestroy() {
this.timer && clearInterval(this.timer)
},
destroyed() {
this.timer && clearInterval(this.timer)
},
methods: {
// handClick(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
if (this.$route && this.$route.name && this.$route.name.includes('panel') && row.type === 0) {
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 }) this.$router.push({ name: row.router, params: param })
this.setReaded(row.msgId) }
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 => {

View File

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

View File

@ -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: '標記已讀成功'
} }
} }

View File

@ -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: '标记已读成功'
} }
} }

View File

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

View File

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

View File

@ -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: [{

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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.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) this.$emit('close-grant', 0)
})
}, },
cancel() { cancel() {
this.$refs[this.activeName].cancel() this.$refs[this.activeName].cancel()

View File

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

View File

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

View File

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

View File

@ -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,8 +60,21 @@ 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) { //
// this.componentName = 'PanelMain'
// this.$nextTick(() => {
// this.$refs.panel_main.msg2Current(routerParam.sourceParam)
// })
// }
// }
this.toMsgShare(routerParam)
},
methods: {
toMsgShare(routerParam) {
if (routerParam !== null && routerParam.msgNotification) {
// //
if (routerParam.msgType === 0) { // if (routerParam.msgType === 0) { //
this.componentName = 'PanelMain' this.componentName = 'PanelMain'
@ -60,8 +83,7 @@ export default {
}) })
} }
} }
}, }
methods: {
} }
} }

View File

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

View File

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