提交 f4b4dac8 authored 作者: wangjiahao's avatar wangjiahao

Merge remote-tracking branch 'origin/main' into main

package io.dataease.dto.chart;
import io.dataease.base.domain.DatasetTableField;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
/**
* @Author gin
* @Date 2021/5/21 4:24 下午
*/
@Getter
@Setter
public class ChartCustomFilterDTO implements Serializable {
private String fieldId;
private String term;
private String value;
private DatasetTableField field;
}
...@@ -2,6 +2,7 @@ package io.dataease.provider; ...@@ -2,6 +2,7 @@ package io.dataease.provider;
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.ChartViewFieldDTO; import io.dataease.dto.chart.ChartViewFieldDTO;
import java.util.List; import java.util.List;
...@@ -27,9 +28,9 @@ public abstract class QueryProvider { ...@@ -27,9 +28,9 @@ public abstract class QueryProvider {
public abstract String createQuerySQLAsTmpWithPage(String sql, List<DatasetTableField> fields, Integer page, Integer pageSize, Integer realSize); public abstract String createQuerySQLAsTmpWithPage(String sql, List<DatasetTableField> fields, Integer page, Integer pageSize, Integer realSize);
public abstract String getSQL(String table, List<ChartViewFieldDTO> xAxis, List<ChartViewFieldDTO> yAxis, List<ChartExtFilterRequest> extFilterRequestList); public abstract String getSQL(String table, List<ChartViewFieldDTO> xAxis, List<ChartViewFieldDTO> yAxis, List<ChartCustomFilterDTO> customFilter, List<ChartExtFilterRequest> extFilterRequestList);
public abstract String getSQLAsTmp(String table, List<ChartViewFieldDTO> xAxis, List<ChartViewFieldDTO> yAxis, List<ChartExtFilterRequest> extFilterRequestList); public abstract String getSQLAsTmp(String table, List<ChartViewFieldDTO> xAxis, List<ChartViewFieldDTO> yAxis, List<ChartCustomFilterDTO> customFilter, List<ChartExtFilterRequest> extFilterRequestList);
public abstract String searchTable(String table); public abstract String searchTable(String table);
} }
...@@ -2,6 +2,7 @@ package io.dataease.provider.doris; ...@@ -2,6 +2,7 @@ package io.dataease.provider.doris;
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.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;
...@@ -110,7 +111,7 @@ public class DorisQueryProvider extends QueryProvider { ...@@ -110,7 +111,7 @@ public class DorisQueryProvider extends QueryProvider {
} }
@Override @Override
public String getSQL(String table, List<ChartViewFieldDTO> xAxis, List<ChartViewFieldDTO> yAxis, List<ChartExtFilterRequest> extFilterRequestList) { public String getSQL(String table, List<ChartViewFieldDTO> xAxis, List<ChartViewFieldDTO> yAxis, List<ChartCustomFilterDTO> customFilter, List<ChartExtFilterRequest> extFilterRequestList) {
// 字段汇总 排序等 // 字段汇总 排序等
String[] field = yAxis.stream().map(y -> { String[] field = yAxis.stream().map(y -> {
StringBuilder f = new StringBuilder(); StringBuilder f = new StringBuilder();
...@@ -180,7 +181,7 @@ public class DorisQueryProvider extends QueryProvider { ...@@ -180,7 +181,7 @@ public class DorisQueryProvider extends QueryProvider {
StringUtils.join(groupField, ","), StringUtils.join(groupField, ","),
StringUtils.join(field, ","), StringUtils.join(field, ","),
table, table,
xFilter.length > 0 ? StringUtils.join(xFilter, " ") : "" + transMysqlExtFilter(extFilterRequestList),// origin field filter and panel field filter (xFilter.length > 0 ? StringUtils.join(xFilter, " ") : "") + transCustomFilter(customFilter) + transExtFilter(extFilterRequestList),// origin field filter and panel field filter
StringUtils.join(group, ","), StringUtils.join(group, ","),
StringUtils.join(order, ",")); StringUtils.join(order, ","));
if (sql.endsWith(",")) { if (sql.endsWith(",")) {
...@@ -222,8 +223,8 @@ public class DorisQueryProvider extends QueryProvider { ...@@ -222,8 +223,8 @@ public class DorisQueryProvider extends QueryProvider {
} }
@Override @Override
public String getSQLAsTmp(String sql, List<ChartViewFieldDTO> xAxis, List<ChartViewFieldDTO> yAxis, List<ChartExtFilterRequest> extFilterRequestList) { public String getSQLAsTmp(String sql, List<ChartViewFieldDTO> xAxis, List<ChartViewFieldDTO> yAxis, List<ChartCustomFilterDTO> customFilter, List<ChartExtFilterRequest> extFilterRequestList) {
return getSQL(" (" + sql + ") AS tmp ", xAxis, yAxis, extFilterRequestList); return getSQL(" (" + sql + ") AS tmp ", xAxis, yAxis, customFilter, extFilterRequestList);
} }
@Override @Override
...@@ -264,7 +265,36 @@ public class DorisQueryProvider extends QueryProvider { ...@@ -264,7 +265,36 @@ public class DorisQueryProvider extends QueryProvider {
} }
} }
public String transMysqlExtFilter(List<ChartExtFilterRequest> requestList) { public String transCustomFilter(List<ChartCustomFilterDTO> requestList) {
if (CollectionUtils.isEmpty(requestList)) {
return "";
}
StringBuilder filter = new StringBuilder();
for (ChartCustomFilterDTO request : requestList) {
String value = request.getValue();
DatasetTableField field = request.getField();
if (field.getDeType() == 1 && field.getDeExtractType() != 1) {
filter.append(" AND FROM_UNIXTIME(cast(")
.append(field.getDataeaseName())
.append(" AS decimal(20,0))/1000,'%Y-%m-%d %H:%i:%S') ");
} else {
filter.append(" AND ").append(field.getDataeaseName());
}
filter.append(" ")
.append(transMysqlFilterTerm(request.getTerm()))
.append(" ");
if (StringUtils.containsIgnoreCase(request.getTerm(), "in")) {
filter.append("('").append(StringUtils.join(value, "','")).append("')");
} else if (StringUtils.containsIgnoreCase(request.getTerm(), "like")) {
filter.append("'%").append(value).append("%'");
} else {
filter.append("'").append(value).append("'");
}
}
return filter.toString();
}
public String transExtFilter(List<ChartExtFilterRequest> requestList) {
if (CollectionUtils.isEmpty(requestList)) { if (CollectionUtils.isEmpty(requestList)) {
return ""; return "";
} }
......
...@@ -2,6 +2,7 @@ package io.dataease.provider.mysql; ...@@ -2,6 +2,7 @@ package io.dataease.provider.mysql;
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.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;
...@@ -110,7 +111,7 @@ public class MysqlQueryProvider extends QueryProvider { ...@@ -110,7 +111,7 @@ public class MysqlQueryProvider extends QueryProvider {
} }
@Override @Override
public String getSQL(String table, List<ChartViewFieldDTO> xAxis, List<ChartViewFieldDTO> yAxis, List<ChartExtFilterRequest> extFilterRequestList) { public String getSQL(String table, List<ChartViewFieldDTO> xAxis, List<ChartViewFieldDTO> yAxis, List<ChartCustomFilterDTO> customFilter, List<ChartExtFilterRequest> extFilterRequestList) {
// 字段汇总 排序等 // 字段汇总 排序等
String[] field = yAxis.stream().map(y -> { String[] field = yAxis.stream().map(y -> {
StringBuilder f = new StringBuilder(); StringBuilder f = new StringBuilder();
...@@ -186,7 +187,7 @@ public class MysqlQueryProvider extends QueryProvider { ...@@ -186,7 +187,7 @@ public class MysqlQueryProvider extends QueryProvider {
StringUtils.join(groupField, ","), StringUtils.join(groupField, ","),
StringUtils.join(field, ","), StringUtils.join(field, ","),
table, table,
(xFilter.length > 0 ? StringUtils.join(xFilter, " ") : "") + transMysqlExtFilter(extFilterRequestList),// origin field filter and panel field filter (xFilter.length > 0 ? StringUtils.join(xFilter, " ") : "") + transCustomFilter(customFilter) + transExtFilter(extFilterRequestList),// origin field filter and panel field filter
StringUtils.join(group, ","), StringUtils.join(group, ","),
StringUtils.join(order, ",")); StringUtils.join(order, ","));
if (sql.endsWith(",")) { if (sql.endsWith(",")) {
...@@ -229,8 +230,8 @@ public class MysqlQueryProvider extends QueryProvider { ...@@ -229,8 +230,8 @@ public class MysqlQueryProvider extends QueryProvider {
} }
@Override @Override
public String getSQLAsTmp(String sql, List<ChartViewFieldDTO> xAxis, List<ChartViewFieldDTO> yAxis, List<ChartExtFilterRequest> extFilterRequestList) { public String getSQLAsTmp(String sql, List<ChartViewFieldDTO> xAxis, List<ChartViewFieldDTO> yAxis, List<ChartCustomFilterDTO> customFilter, List<ChartExtFilterRequest> extFilterRequestList) {
return getSQL(" (" + sqlFix(sql) + ") AS tmp ", xAxis, yAxis, extFilterRequestList); return getSQL(" (" + sqlFix(sql) + ") AS tmp ", xAxis, yAxis, customFilter, extFilterRequestList);
} }
@Override @Override
...@@ -271,7 +272,36 @@ public class MysqlQueryProvider extends QueryProvider { ...@@ -271,7 +272,36 @@ public class MysqlQueryProvider extends QueryProvider {
} }
} }
public String transMysqlExtFilter(List<ChartExtFilterRequest> requestList) { public String transCustomFilter(List<ChartCustomFilterDTO> requestList) {
if (CollectionUtils.isEmpty(requestList)) {
return "";
}
StringBuilder filter = new StringBuilder();
for (ChartCustomFilterDTO request : requestList) {
String value = request.getValue();
DatasetTableField field = request.getField();
if (field.getDeType() == 1 && field.getDeExtractType() != 1) {
filter.append(" AND FROM_UNIXTIME(cast(")
.append(field.getDataeaseName())
.append(" AS decimal(20,0))/1000,'%Y-%m-%d %H:%i:%S') ");
} else {
filter.append(" AND ").append(field.getDataeaseName());
}
filter.append(" ")
.append(transMysqlFilterTerm(request.getTerm()))
.append(" ");
if (StringUtils.containsIgnoreCase(request.getTerm(), "in")) {
filter.append("('").append(StringUtils.join(value, "','")).append("')");
} else if (StringUtils.containsIgnoreCase(request.getTerm(), "like")) {
filter.append("'%").append(value).append("%'");
} else {
filter.append("'").append(value).append("'");
}
}
return filter.toString();
}
public String transExtFilter(List<ChartExtFilterRequest> requestList) {
if (CollectionUtils.isEmpty(requestList)) { if (CollectionUtils.isEmpty(requestList)) {
return ""; return "";
} }
......
...@@ -2,6 +2,7 @@ package io.dataease.provider.sqlserver; ...@@ -2,6 +2,7 @@ package io.dataease.provider.sqlserver;
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.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;
...@@ -111,7 +112,7 @@ public class SqlserverQueryProvider extends QueryProvider { ...@@ -111,7 +112,7 @@ public class SqlserverQueryProvider extends QueryProvider {
} }
@Override @Override
public String getSQL(String table, List<ChartViewFieldDTO> xAxis, List<ChartViewFieldDTO> yAxis, List<ChartExtFilterRequest> extFilterRequestList) { public String getSQL(String table, List<ChartViewFieldDTO> xAxis, List<ChartViewFieldDTO> yAxis, List<ChartCustomFilterDTO> customFilter, List<ChartExtFilterRequest> extFilterRequestList) {
// 字段汇总 排序等 // 字段汇总 排序等
String[] field = yAxis.stream().map(y -> { String[] field = yAxis.stream().map(y -> {
StringBuilder f = new StringBuilder(); StringBuilder f = new StringBuilder();
...@@ -187,7 +188,7 @@ public class SqlserverQueryProvider extends QueryProvider { ...@@ -187,7 +188,7 @@ public class SqlserverQueryProvider extends QueryProvider {
StringUtils.join(groupField, ","), StringUtils.join(groupField, ","),
StringUtils.join(field, ","), StringUtils.join(field, ","),
table, table,
(xFilter.length > 0 ? StringUtils.join(xFilter, " ") : "") + transMysqlExtFilter(extFilterRequestList),// origin field filter and panel field filter (xFilter.length > 0 ? StringUtils.join(xFilter, " ") : "") + transCustomFilter(customFilter) + transExtFilter(extFilterRequestList),// origin field filter and panel field filter
StringUtils.join(group, ","), StringUtils.join(group, ","),
StringUtils.join(order, ",")); StringUtils.join(order, ","));
if (sql.endsWith(",")) { if (sql.endsWith(",")) {
...@@ -230,8 +231,8 @@ public class SqlserverQueryProvider extends QueryProvider { ...@@ -230,8 +231,8 @@ public class SqlserverQueryProvider extends QueryProvider {
} }
@Override @Override
public String getSQLAsTmp(String sql, List<ChartViewFieldDTO> xAxis, List<ChartViewFieldDTO> yAxis, List<ChartExtFilterRequest> extFilterRequestList) { public String getSQLAsTmp(String sql, List<ChartViewFieldDTO> xAxis, List<ChartViewFieldDTO> yAxis, List<ChartCustomFilterDTO> customFilter, List<ChartExtFilterRequest> extFilterRequestList) {
return getSQL(" (" + sqlFix(sql) + ") AS tmp ", xAxis, yAxis, extFilterRequestList); return getSQL(" (" + sqlFix(sql) + ") AS tmp ", xAxis, yAxis, customFilter, extFilterRequestList);
} }
@Override @Override
...@@ -270,7 +271,36 @@ public class SqlserverQueryProvider extends QueryProvider { ...@@ -270,7 +271,36 @@ public class SqlserverQueryProvider extends QueryProvider {
} }
} }
public String transMysqlExtFilter(List<ChartExtFilterRequest> requestList) { public String transCustomFilter(List<ChartCustomFilterDTO> requestList) {
if (CollectionUtils.isEmpty(requestList)) {
return "";
}
StringBuilder filter = new StringBuilder();
for (ChartCustomFilterDTO request : requestList) {
String value = request.getValue();
DatasetTableField field = request.getField();
if (field.getDeType() == 1 && field.getDeExtractType() != 1) {
filter.append(" AND FROM_UNIXTIME(cast(")
.append(field.getDataeaseName())
.append(" AS decimal(20,0))/1000,'%Y-%m-%d %H:%i:%S') ");
} else {
filter.append(" AND ").append(field.getDataeaseName());
}
filter.append(" ")
.append(transMysqlFilterTerm(request.getTerm()))
.append(" ");
if (StringUtils.containsIgnoreCase(request.getTerm(), "in")) {
filter.append("('").append(StringUtils.join(value, "','")).append("')");
} else if (StringUtils.containsIgnoreCase(request.getTerm(), "like")) {
filter.append("'%").append(value).append("%'");
} else {
filter.append("'").append(value).append("'");
}
}
return filter.toString();
}
public String transExtFilter(List<ChartExtFilterRequest> requestList) {
if (CollectionUtils.isEmpty(requestList)) { if (CollectionUtils.isEmpty(requestList)) {
return ""; return "";
} }
......
...@@ -15,6 +15,7 @@ import io.dataease.datasource.provider.DatasourceProvider; ...@@ -15,6 +15,7 @@ import io.dataease.datasource.provider.DatasourceProvider;
import io.dataease.datasource.provider.ProviderFactory; import io.dataease.datasource.provider.ProviderFactory;
import io.dataease.datasource.request.DatasourceRequest; import io.dataease.datasource.request.DatasourceRequest;
import io.dataease.datasource.service.DatasourceService; import io.dataease.datasource.service.DatasourceService;
import io.dataease.dto.chart.ChartCustomFilterDTO;
import io.dataease.dto.chart.ChartViewDTO; import io.dataease.dto.chart.ChartViewDTO;
import io.dataease.dto.chart.ChartViewFieldDTO; import io.dataease.dto.chart.ChartViewFieldDTO;
import io.dataease.dto.chart.Series; import io.dataease.dto.chart.Series;
...@@ -31,6 +32,7 @@ import javax.annotation.Resource; ...@@ -31,6 +32,7 @@ import javax.annotation.Resource;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
/** /**
* @Author gin * @Author gin
...@@ -89,6 +91,9 @@ public class ChartViewService { ...@@ -89,6 +91,9 @@ public class ChartViewService {
}.getType()); }.getType());
List<ChartViewFieldDTO> yAxis = new Gson().fromJson(view.getYAxis(), new TypeToken<List<ChartViewFieldDTO>>() { List<ChartViewFieldDTO> yAxis = new Gson().fromJson(view.getYAxis(), new TypeToken<List<ChartViewFieldDTO>>() {
}.getType()); }.getType());
List<ChartCustomFilterDTO> customFilter = new Gson().fromJson(view.getCustomFilter(), new TypeToken<List<ChartCustomFilterDTO>>() {
}.getType());
customFilter.forEach(ele -> ele.setField(dataSetTableFieldsService.get(ele.getFieldId())));
if (CollectionUtils.isEmpty(xAxis) || CollectionUtils.isEmpty(yAxis)) { if (CollectionUtils.isEmpty(xAxis) || CollectionUtils.isEmpty(yAxis)) {
ChartViewDTO dto = new ChartViewDTO(); ChartViewDTO dto = new ChartViewDTO();
...@@ -127,9 +132,9 @@ public class ChartViewService { ...@@ -127,9 +132,9 @@ public class ChartViewService {
QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType()); QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType());
if (StringUtils.equalsIgnoreCase(table.getType(), "db")) { if (StringUtils.equalsIgnoreCase(table.getType(), "db")) {
datasourceRequest.setTable(dataTableInfoDTO.getTable()); datasourceRequest.setTable(dataTableInfoDTO.getTable());
datasourceRequest.setQuery(qp.getSQL(dataTableInfoDTO.getTable(), xAxis, yAxis, extFilterList)); datasourceRequest.setQuery(qp.getSQL(dataTableInfoDTO.getTable(), xAxis, yAxis, customFilter, extFilterList));
} else if (StringUtils.equalsIgnoreCase(table.getType(), "sql")) { } else if (StringUtils.equalsIgnoreCase(table.getType(), "sql")) {
datasourceRequest.setQuery(qp.getSQLAsTmp(dataTableInfoDTO.getSql(), xAxis, yAxis, extFilterList)); datasourceRequest.setQuery(qp.getSQLAsTmp(dataTableInfoDTO.getSql(), xAxis, yAxis, customFilter, extFilterList));
} }
data = datasourceProvider.getData(datasourceRequest); data = datasourceProvider.getData(datasourceRequest);
} else if (table.getMode() == 1) {// 抽取 } else if (table.getMode() == 1) {// 抽取
...@@ -141,7 +146,7 @@ public class ChartViewService { ...@@ -141,7 +146,7 @@ public class ChartViewService {
String tableName = "ds_" + table.getId().replaceAll("-", "_"); String tableName = "ds_" + table.getId().replaceAll("-", "_");
datasourceRequest.setTable(tableName); datasourceRequest.setTable(tableName);
QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType()); QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType());
datasourceRequest.setQuery(qp.getSQL(tableName, xAxis, yAxis, extFilterList)); datasourceRequest.setQuery(qp.getSQL(tableName, xAxis, yAxis, customFilter, extFilterList));
data = datasourceProvider.getData(datasourceRequest); data = datasourceProvider.getData(datasourceRequest);
} }
......
...@@ -71,6 +71,9 @@ public class SysUserService { ...@@ -71,6 +71,9 @@ public class SysUserService {
}else{ }else{
user.setPassword(CodingUtil.md5(user.getPassword())); user.setPassword(CodingUtil.md5(user.getPassword()));
} }
if(StringUtils.isEmpty(user.getLanguage())){
user.setLanguage("zh_CN");
}
int insert = sysUserMapper.insert(user); int insert = sysUserMapper.insert(user);
SysUser dbUser = findOne(user); SysUser dbUser = findOne(user);
saveUserRoles(dbUser.getUserId(), request.getRoleIds());//插入用户角色关联 saveUserRoles(dbUser.getUserId(), request.getRoleIds());//插入用户角色关联
......
...@@ -51,8 +51,8 @@ INSERT INTO `sys_menu` VALUES (52, 0, 0, 1, '关于', 'about', 'system/about/ind ...@@ -51,8 +51,8 @@ INSERT INTO `sys_menu` VALUES (52, 0, 0, 1, '关于', 'about', 'system/about/ind
COMMIT; COMMIT;
BEGIN; BEGIN;
INSERT INTO `sys_user` VALUES (4, 0, 'admin', '管理员', '男', NULL, 'admin@fit2cloud.com', '40b8893ea9ebc2d631c4bb42bb1e8996', b'1', 1, NULL, NULL, NULL, NULL, 1615184951534,NULL); INSERT INTO `sys_user` VALUES (4, 0, 'admin', '管理员', '男', NULL, 'admin@fit2cloud.com', '40b8893ea9ebc2d631c4bb42bb1e8996', b'1', 1, NULL, NULL, NULL, NULL, 1615184951534,'zh_CN');
INSERT INTO `sys_user` VALUES (19, 25, 'demo', 'demo', '男', NULL, 'demo@fit2cloud.com', '40b8893ea9ebc2d631c4bb42bb1e8996', b'0', 0, NULL, NULL, NULL, 1619086036234, 1619086036234,NULL); INSERT INTO `sys_user` VALUES (19, 25, 'demo', 'demo', '男', NULL, 'demo@fit2cloud.com', '40b8893ea9ebc2d631c4bb42bb1e8996', b'0', 0, NULL, NULL, NULL, 1619086036234, 1619086036234,'zh_CN');
COMMIT; COMMIT;
......
...@@ -38,6 +38,7 @@ ...@@ -38,6 +38,7 @@
"vue-axios": "3.2.4", "vue-axios": "3.2.4",
"vue-clipboard2": "0.3.1", "vue-clipboard2": "0.3.1",
"vue-codemirror": "^4.0.6", "vue-codemirror": "^4.0.6",
"vue-cron": "^1.0.9",
"vue-i18n": "7.3.2", "vue-i18n": "7.3.2",
"vue-router": "3.0.6", "vue-router": "3.0.6",
"vue-uuid": "2.0.2", "vue-uuid": "2.0.2",
......
...@@ -672,7 +672,9 @@ export default { ...@@ -672,7 +672,9 @@ export default {
only_one_result: 'Only show first result', only_one_result: 'Only show first result',
dimension_show: 'Dimension Show', dimension_show: 'Dimension Show',
quota_show: 'Quota Show', quota_show: 'Quota Show',
title_limit: 'Title cannot be greater than 50 characters' title_limit: 'Title cannot be greater than 50 characters',
filter_condition: 'Filter Condition',
filter_field_can_null: 'Filter field must choose'
}, },
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',
......
...@@ -671,7 +671,9 @@ export default { ...@@ -671,7 +671,9 @@ export default {
only_one_result: '僅顯示第1個計算結果', only_one_result: '僅顯示第1個計算結果',
dimension_show: '維度顯示', dimension_show: '維度顯示',
quota_show: '指標顯示', quota_show: '指標顯示',
title_limit: '標題不能大於50個字符' title_limit: '標題不能大於50個字符',
filter_condition: '過濾條件',
filter_field_can_null: '過濾字段必填'
}, },
dataset: { dataset: {
sheet_warn: '有多個sheet頁面,默認抽取第一個', sheet_warn: '有多個sheet頁面,默認抽取第一個',
......
...@@ -673,7 +673,9 @@ export default { ...@@ -673,7 +673,9 @@ export default {
only_one_result: '仅显示第1个计算结果', only_one_result: '仅显示第1个计算结果',
dimension_show: '维度显示', dimension_show: '维度显示',
quota_show: '指标显示', quota_show: '指标显示',
title_limit: '标题不能大于50个字符' title_limit: '标题不能大于50个字符',
filter_condition: '过滤条件',
filter_field_can_null: '过滤字段必填'
}, },
dataset: { dataset: {
sheet_warn: '有多个Sheet页,默认抽取第一个', sheet_warn: '有多个Sheet页,默认抽取第一个',
......
...@@ -30,11 +30,9 @@ import * as echarts from 'echarts' ...@@ -30,11 +30,9 @@ import * as echarts from 'echarts'
Vue.prototype.$echarts = echarts Vue.prototype.$echarts = echarts
import UmyUi from 'umy-ui' import UmyUi from 'umy-ui'
Vue.use(UmyUi) Vue.use(UmyUi)
import vcolorpicker from 'vcolorpicker' import vcolorpicker from 'vcolorpicker'
Vue.use(vcolorpicker) Vue.use(vcolorpicker)
/** /**
......
<template> <template>
<el-col> <el-col>
<el-button icon="el-icon-plus" circle size="mini" style="margin-bottom: 10px;" @click="addFilter" /> <el-button icon="el-icon-plus" circle size="mini" style="margin-bottom: 10px;" @click="addFilter" />
<el-row v-for="(f,index) in item.filter" :key="index" class="filter-item"> <div style="max-height: 50vh;overflow-y: auto;">
<el-col :span="4"> <el-row v-for="(f,index) in item.filter" :key="index" class="filter-item">
<span>{{ item.name }}</span> <el-col :span="4">
</el-col> <span>{{ item.name }}</span>
<el-col :span="8"> </el-col>
<el-select v-model="f.term" size="mini"> <el-col :span="8">
<el-option-group <el-select v-model="f.term" size="mini">
v-for="(group,idx) in options" <el-option-group
:key="idx" v-for="(group,idx) in options"
:label="group.label" :key="idx"
> :label="group.label"
<el-option >
v-for="opt in group.options" <el-option
:key="opt.value" v-for="opt in group.options"
:label="opt.label" :key="opt.value"
:value="opt.value" :label="opt.label"
/> :value="opt.value"
</el-option-group> />
</el-select> </el-option-group>
</el-col> </el-select>
<el-col :span="6"> </el-col>
<el-input v-model="f.value" class="value-item" :placeholder="$t('chart.no_limit')" size="mini" clearable /> <el-col :span="6">
</el-col> <el-input v-model="f.value" class="value-item" :placeholder="$t('chart.no_limit')" size="mini" clearable />
<el-col :span="6"> </el-col>
<el-button type="text" icon="el-icon-delete" circle style="float: right" @click="removeFilter(index)" /> <el-col :span="6">
</el-col> <el-button type="text" icon="el-icon-delete" circle style="float: right" @click="removeFilter(index)" />
</el-row> </el-col>
</el-row>
</div>
</el-col> </el-col>
</template> </template>
......
<template> <template>
<el-col> <el-col>
<el-button icon="el-icon-plus" circle size="mini" style="margin-bottom: 10px;" @click="addFilter" /> <el-button icon="el-icon-plus" circle size="mini" style="margin-bottom: 10px;" @click="addFilter" />
<el-row v-for="(f,index) in item.filter" :key="index" class="filter-item"> <div style="max-height: 50vh;overflow-y: auto;">
<el-col :span="4"> <el-row v-for="(f,index) in item.filter" :key="index" class="filter-item">
<span>{{ item.name }} ({{ $t('chart.'+item.summary) }})</span> <el-col :span="4">
</el-col> <span>{{ item.name }} ({{ $t('chart.'+item.summary) }})</span>
<el-col :span="8"> </el-col>
<el-select v-model="f.term" size="mini"> <el-col :span="8">
<el-option-group <el-select v-model="f.term" size="mini">
v-for="(group,idx) in options" <el-option-group
:key="idx" v-for="(group,idx) in options"
:label="group.label" :key="idx"
> :label="group.label"
<el-option >
v-for="opt in group.options" <el-option
:key="opt.value" v-for="opt in group.options"
:label="opt.label" :key="opt.value"
:value="opt.value" :label="opt.label"
/> :value="opt.value"
</el-option-group> />
</el-select> </el-option-group>
</el-col> </el-select>
<el-col :span="6"> </el-col>
<el-input v-model="f.value" class="value-item" :placeholder="$t('chart.no_limit')" size="mini" clearable /> <el-col :span="6">
</el-col> <el-input v-model="f.value" class="value-item" :placeholder="$t('chart.no_limit')" size="mini" clearable />
<el-col :span="6"> </el-col>
<el-button type="text" icon="el-icon-delete" circle style="float: right" @click="removeFilter(index)" /> <el-col :span="6">
</el-col> <el-button type="text" icon="el-icon-delete" circle style="float: right" @click="removeFilter(index)" />
</el-row> </el-col>
</el-row>
</div>
</el-col> </el-col>
</template> </template>
......
<template>
<el-col>
<el-button icon="el-icon-plus" circle size="mini" style="margin-bottom: 10px;" @click="addFilter" />
<div style="max-height: 50vh;overflow-y: auto;">
<el-row v-for="(f,index) in chart.customFilter" :key="index" class="filter-item">
<el-col :span="6">
<el-select v-model="f.fieldId" size="mini" filterable>
<el-option
v-for="item in fields"
:key="item.id"
:label="item.name"
:value="item.id"
>
<span style="float: left">
<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 === 2 || item.deType === 3" icon-class="field_value" class="field-icon-value" />
</span>
<span style="float: left; color: #8492a6; font-size: 12px">{{ item.name }}</span>
</el-option>
</el-select>
</el-col>
<el-col :span="6">
<el-select v-model="f.term" size="mini">
<el-option-group
v-for="(group,idx) in options"
:key="idx"
:label="group.label"
>
<el-option
v-for="opt in group.options"
:key="opt.value"
:label="opt.label"
:value="opt.value"
/>
</el-option-group>
</el-select>
</el-col>
<el-col :span="6">
<el-input v-model="f.value" class="value-item" :placeholder="$t('chart.no_limit')" size="mini" clearable />
</el-col>
<el-col :span="6">
<el-button type="text" icon="el-icon-delete" circle style="float: right" @click="removeFilter(index)" />
</el-col>
</el-row>
</div>
</el-col>
</template>
<script>
import { fieldList } from '../../../../api/dataset/dataset'
export default {
name: 'ResultFilterEditor',
props: {
chart: {
type: Object,
required: true
}
},
data() {
return {
options: [{
label: '',
options: [{
value: 'eq',
label: this.$t('chart.filter_eq')
}, {
value: 'not_eq',
label: this.$t('chart.filter_not_eq')
}]
}, {
label: '',
options: [{
value: 'lt',
label: this.$t('chart.filter_lt')
}, {
value: 'gt',
label: this.$t('chart.filter_gt')
}]
},
{
label: '',
options: [{
value: 'le',
label: this.$t('chart.filter_le')
}, {
value: 'ge',
label: this.$t('chart.filter_ge')
}]
},
{
label: '',
options: [{
value: 'null',
label: this.$t('chart.filter_null')
}, {
value: 'not_null',
label: this.$t('chart.filter_not_null')
}]
}],
fields: []
}
},
mounted() {
fieldList(this.chart.tableId).then(response => {
this.fields = response.data
})
},
methods: {
addFilter() {
this.chart.customFilter.push({
fieldId: '',
term: 'eq',
value: ''
})
},
removeFilter(index) {
this.chart.customFilter.splice(index, 1)
}
}
}
</script>
<style scoped>
.filter-item{
width: 100%;
border-radius: 4px;
border: 1px solid #DCDFE6;
padding: 4px 14px;
margin-bottom: 10px;
display: flex;
justify-content: left;
align-items: center;
}
.form-item>>>.el-form-item__label{
font-size: 12px;
}
span{
font-size: 12px;
}
.value-item>>>.el-input{
position: relative;
display: inline-block;
width: 80px!important;
}
.el-select-dropdown__item{
padding: 0 20px;
font-size: 12px;
}
</style>
...@@ -165,22 +165,11 @@ ...@@ -165,22 +165,11 @@
</el-tab-pane> </el-tab-pane>
</el-tabs> </el-tabs>
</div> </div>
<div v-if="false" style="overflow:auto;border-top: 1px solid #e6e6e6" class="padding-lr filter-class"> <div style="height:60px;overflow:auto;border-top: 1px solid #e6e6e6" class="padding-lr filter-class">
<span>{{ $t('chart.result_filter') }}</span> <span>{{ $t('chart.result_filter') }}</span>
<div style="margin: 8px" class="filter-inner-class"> <el-button size="mini" class="filter-btn-class" @click="showResultFilter">
<draggable {{ $t('chart.filter_condition') }}<i class="el-icon-setting el-icon--right" />
v-model="view.customFilter" </el-button>
group="drag"
animation="300"
:move="onMove"
style="height:100%;margin:0;overflow-x: auto;background-color: white;"
@end="end2"
>
<transition-group class="draggable-group">
<filter-item v-for="(item,index) in view.customFilter" :key="item.id" :index="index" :item="item" />
</transition-group>
</draggable>
</div>
</div> </div>
</el-col> </el-col>
...@@ -188,7 +177,7 @@ ...@@ -188,7 +177,7 @@
<el-row style="width: 100%;height: 100%;" class="padding-lr"> <el-row style="width: 100%;height: 100%;" class="padding-lr">
<el-row style="margin-top: 10px;"> <el-row style="margin-top: 10px;">
<el-row style="display:flex;height: 32px;"> <el-row style="display:flex;height: 32px;">
<span style="line-height: 32px;width: 60px;text-align: right;">{{ $t('chart.dimension') }}</span> <span style="line-height: 32px;width: 80px;text-align: right;">{{ $t('chart.dimension') }}</span>
<draggable <draggable
v-model="view.xaxis" v-model="view.xaxis"
group="dimension" group="dimension"
...@@ -203,7 +192,7 @@ ...@@ -203,7 +192,7 @@
</draggable> </draggable>
</el-row> </el-row>
<el-row style="display:flex;height: 32px;margin-top: 10px;"> <el-row style="display:flex;height: 32px;margin-top: 10px;">
<span style="line-height: 32px;width: 60px;text-align: right;">{{ $t('chart.quota') }}</span> <span style="line-height: 32px;width: 80px;text-align: right;">{{ $t('chart.quota') }}</span>
<draggable <draggable
v-model="view.yaxis" v-model="view.yaxis"
group="quota" group="quota"
...@@ -275,6 +264,20 @@ ...@@ -275,6 +264,20 @@
<el-button type="primary" size="mini" @click="saveDimensionFilter">{{ $t('chart.confirm') }}</el-button> <el-button type="primary" size="mini" @click="saveDimensionFilter">{{ $t('chart.confirm') }}</el-button>
</div> </div>
</el-dialog> </el-dialog>
<el-dialog
v-dialogDrag
:title="$t('chart.add_filter')"
:visible="resultFilterEdit"
:show-close="false"
width="800px"
class="dialog-css"
>
<result-filter-editor :chart="chartForFilter" />
<div slot="footer" class="dialog-footer">
<el-button size="mini" @click="closeResultFilter">{{ $t('chart.cancel') }}</el-button>
<el-button type="primary" size="mini" @click="saveResultFilter">{{ $t('chart.confirm') }}</el-button>
</div>
</el-dialog>
</el-row> </el-row>
</template> </template>
...@@ -283,7 +286,7 @@ import { post, ajaxGetData } from '@/api/chart/chart' ...@@ -283,7 +286,7 @@ import { post, ajaxGetData } from '@/api/chart/chart'
import draggable from 'vuedraggable' import draggable from 'vuedraggable'
import DimensionItem from '../components/drag-item/DimensionItem' import DimensionItem from '../components/drag-item/DimensionItem'
import QuotaItem from '../components/drag-item/QuotaItem' import QuotaItem from '../components/drag-item/QuotaItem'
import FilterItem from '../components/drag-item/FilterItem' import ResultFilterEditor from '../components/filter/ResultFilterEditor'
import ChartComponent from '../components/ChartComponent' import ChartComponent from '../components/ChartComponent'
import bus from '@/utils/bus' import bus from '@/utils/bus'
import DatasetChartDetail from '../../dataset/common/DatasetChartDetail' import DatasetChartDetail from '../../dataset/common/DatasetChartDetail'
...@@ -317,7 +320,7 @@ import html2canvas from 'html2canvas' ...@@ -317,7 +320,7 @@ import html2canvas from 'html2canvas'
export default { export default {
name: 'ChartEdit', name: 'ChartEdit',
components: { LabelNormal, DimensionFilterEditor, TableNormal, DatasetChartDetail, QuotaFilterEditor, BackgroundColorSelector, FilterItem, XAxisSelector, YAxisSelector, TooltipSelector, LabelSelector, LegendSelector, TitleSelector, SizeSelector, ColorSelector, ChartComponent, QuotaItem, DimensionItem, draggable }, components: { 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,
...@@ -359,6 +362,8 @@ export default { ...@@ -359,6 +362,8 @@ export default {
dimensionItem: {}, dimensionItem: {},
quotaFilterEdit: false, quotaFilterEdit: false,
quotaItem: {}, quotaItem: {},
resultFilterEdit: false,
chartForFilter: {},
renameItem: false, renameItem: false,
itemForm: { itemForm: {
name: '' name: ''
...@@ -784,6 +789,30 @@ export default { ...@@ -784,6 +789,30 @@ export default {
this.closeQuotaFilter() this.closeQuotaFilter()
}, },
showResultFilter() {
this.chartForFilter = JSON.parse(JSON.stringify(this.view))
this.resultFilterEdit = true
},
closeResultFilter() {
this.resultFilterEdit = false
},
saveResultFilter() {
for (let i = 0; i < this.chartForFilter.customFilter.length; i++) {
const f = this.chartForFilter.customFilter[i]
if (!f.fieldId || f.fieldId === '') {
this.$message({
message: this.$t('chart.filter_field_can_null'),
type: 'error',
showClose: true
})
return
}
}
this.view.customFilter = this.chartForFilter.customFilter
this.save(true)
this.closeResultFilter()
},
showRename(val) { showRename(val) {
this.itemForm = JSON.parse(JSON.stringify(val)) this.itemForm = JSON.parse(JSON.stringify(val))
this.renameItem = true this.renameItem = true
...@@ -948,7 +977,7 @@ export default { ...@@ -948,7 +977,7 @@ export default {
} }
.attr-style{ .attr-style{
height: calc(100vh - 56px - 25vh - 40px - 62px - 10px); height: calc(100vh - 56px - 25vh - 40px - 62px - 10px - 60px);
} }
.attr-selector{ .attr-selector{
...@@ -992,4 +1021,13 @@ export default { ...@@ -992,4 +1021,13 @@ export default {
.dialog-css >>> .el-dialog__body { .dialog-css >>> .el-dialog__body {
padding: 10px 20px 20px; padding: 10px 20px 20px;
} }
.filter-btn-class{
padding: 6px;
border: none;
width: 100%;
display: flex;
justify-content: space-between;
align-items: center;
}
</style> </style>
...@@ -134,7 +134,10 @@ ...@@ -134,7 +134,10 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item v-if="taskForm.rate === 'CRON'" label=""> <el-form-item v-if="taskForm.rate === 'CRON'" label="">
<el-input v-model="taskForm.cron" size="mini" style="width: 50%" /> <el-popover v-model="cronEdit">
<cron @close="cronEdit = false" @change="cronChange" i18n="cn"/>
<el-input v-model="taskForm.cron" size="mini" style="width: 50%" @click="cronEdit = true" slot="reference"/>
</el-popover>
</el-form-item> </el-form-item>
<el-form-item :label="$t('dataset.end_time')" prop="end"> <el-form-item :label="$t('dataset.end_time')" prop="end">
<el-select v-model="taskForm.end" size="mini"> <el-select v-model="taskForm.end" size="mini">
...@@ -285,10 +288,12 @@ import 'codemirror/keymap/emacs.js' ...@@ -285,10 +288,12 @@ import 'codemirror/keymap/emacs.js'
import 'codemirror/addon/hint/show-hint.css' import 'codemirror/addon/hint/show-hint.css'
import 'codemirror/addon/hint/sql-hint' import 'codemirror/addon/hint/sql-hint'
import 'codemirror/addon/hint/show-hint' import 'codemirror/addon/hint/show-hint'
// vue-cron
import { cron } from 'vue-cron'
export default { export default {
name: 'UpdateInfo', name: 'UpdateInfo',
components: { codemirror }, components: { codemirror, cron },
props: { props: {
table: { table: {
type: Object, type: Object,
...@@ -348,7 +353,8 @@ export default { ...@@ -348,7 +353,8 @@ export default {
}, },
incrementalUpdateType: 'incrementalAdd', incrementalUpdateType: 'incrementalAdd',
sql: '', sql: '',
incrementalConfig: {} incrementalConfig: {},
cronEdit: false
} }
}, },
computed: { computed: {
...@@ -563,6 +569,9 @@ export default { ...@@ -563,6 +569,9 @@ export default {
pos2.line = pos1.line pos2.line = pos1.line
pos2.ch = pos1.ch pos2.ch = pos1.ch
this.$refs.myCm.codemirror.replaceRange(param, pos2) this.$refs.myCm.codemirror.replaceRange(param, pos2)
},
cronChange(val) {
this.taskForm.cron = val
} }
} }
} }
......
...@@ -36,8 +36,13 @@ export default { ...@@ -36,8 +36,13 @@ export default {
starDatas: [] starDatas: []
} }
}, },
computed: {
panelInfo() {
return this.$store.state.panel.panelInfo
}
},
created() { created() {
bus.$on('panle_start_list_refresh', this.initData) bus.$on('panle_start_list_refresh', this.refreshStarts)
this.initData() this.initData()
}, },
methods: { methods: {
...@@ -64,12 +69,20 @@ export default { ...@@ -64,12 +69,20 @@ export default {
remove(row) { remove(row) {
deleteEnshrine(row.storeId).then(res => { deleteEnshrine(row.storeId).then(res => {
this.initData() this.initData()
this.panelInfo && this.panelInfo.id && row.panelGroupId === this.panelInfo.id && this.setMainNull()
}) })
}, },
initData() { initData() {
enshrineList({}).then(res => { enshrineList({}).then(res => {
this.starDatas = res.data this.starDatas = res.data
}) })
},
setMainNull() {
this.$store.dispatch('panel/setPanelInfo', { id: null, name: '', preStyle: null })
},
refreshStarts(isStar) {
this.initData()
!isStar && this.setMainNull()
} }
} }
} }
......
...@@ -162,13 +162,13 @@ export default { ...@@ -162,13 +162,13 @@ export default {
star() { star() {
this.panelInfo && saveEnshrine(this.panelInfo.id).then(res => { this.panelInfo && saveEnshrine(this.panelInfo.id).then(res => {
this.hasStar = true this.hasStar = true
this.refreshStarList() this.refreshStarList(true)
}) })
}, },
unstar() { unstar() {
this.panelInfo && deleteEnshrine(this.panelInfo.id).then(res => { this.panelInfo && deleteEnshrine(this.panelInfo.id).then(res => {
this.hasStar = false this.hasStar = false
this.refreshStarList() this.refreshStarList(false)
}) })
}, },
initHasStar() { initHasStar() {
...@@ -177,8 +177,8 @@ export default { ...@@ -177,8 +177,8 @@ export default {
this.hasStar = res.data && res.data.some(item => item.panelGroupId === this.panelInfo.id) this.hasStar = res.data && res.data.some(item => item.panelGroupId === this.panelInfo.id)
}) })
}, },
refreshStarList() { refreshStarList(isStar) {
bus.$emit('panle_start_list_refresh') bus.$emit('panle_start_list_refresh', isStar)
} }
} }
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
<div> <div>
<el-card class="box-card about-card"> <el-card class="box-card about-card">
<div slot="header" class="clearfix license-header"> <div slot="header" class="clearfix license-header">
<img src="@/assets/DataEase-white.png" alt="" style="height: 80px;width: 400px;padding-top: 15px;"> <img src="@/assets/DataEase-white.png" alt="" width="300">
</div> </div>
<div class="license-content"> <div class="license-content">
<div v-if="license.status === 'Fail'">{{ $t('about.invalid_license') }}</div> <div v-if="license.status === 'Fail'">{{ $t('about.invalid_license') }}</div>
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论