forked from github/dataease
commit
2ae87843d5
@ -384,7 +384,7 @@
|
|||||||
<includes>
|
<includes>
|
||||||
<include>**/*</include>
|
<include>**/*</include>
|
||||||
</includes>
|
</includes>
|
||||||
<filtering>true</filtering>
|
<filtering>false</filtering>
|
||||||
</resource>
|
</resource>
|
||||||
</resources>
|
</resources>
|
||||||
<plugins>
|
<plugins>
|
||||||
@ -414,11 +414,11 @@
|
|||||||
<skipTests>true</skipTests>
|
<skipTests>true</skipTests>
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
<!--<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-resources-plugin</artifactId>
|
<artifactId>maven-resources-plugin</artifactId>
|
||||||
<version>2.4.3</version>
|
<version>2.4.3</version>
|
||||||
</plugin>
|
</plugin>-->
|
||||||
|
|
||||||
<plugin>
|
<plugin>
|
||||||
<artifactId>maven-clean-plugin</artifactId>
|
<artifactId>maven-clean-plugin</artifactId>
|
||||||
|
@ -0,0 +1,78 @@
|
|||||||
|
package io.dataease.commons.filter;
|
||||||
|
|
||||||
|
import io.dataease.commons.holder.ThreadLocalContextHolder;
|
||||||
|
import io.dataease.commons.wrapper.XssAndSqlHttpServletRequestWrapper;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import javax.servlet.*;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import java.io.*;
|
||||||
|
|
||||||
|
|
||||||
|
public class SqlFilter implements Filter {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void destroy() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
|
||||||
|
|
||||||
|
String method = "GET";
|
||||||
|
String param = "";
|
||||||
|
XssAndSqlHttpServletRequestWrapper xssRequest = null;
|
||||||
|
if (request instanceof HttpServletRequest) {
|
||||||
|
method = ((HttpServletRequest) request).getMethod();
|
||||||
|
xssRequest = new XssAndSqlHttpServletRequestWrapper((HttpServletRequest) request);
|
||||||
|
}
|
||||||
|
if ("POST".equalsIgnoreCase(method)) {
|
||||||
|
param = this.getBodyString(xssRequest.getReader());
|
||||||
|
if(StringUtils.isNotBlank(param)){
|
||||||
|
if(xssRequest.checkXSSAndSql(param)){
|
||||||
|
response.setCharacterEncoding("UTF-8");
|
||||||
|
response.setContentType("application/json;charset=UTF-8");
|
||||||
|
PrintWriter out = response.getWriter();
|
||||||
|
String msg = ThreadLocalContextHolder.getData().toString();
|
||||||
|
out.write(msg);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (xssRequest.checkParameter()) {
|
||||||
|
response.setCharacterEncoding("UTF-8");
|
||||||
|
response.setContentType("application/json;charset=UTF-8");
|
||||||
|
PrintWriter out = response.getWriter();
|
||||||
|
String msg = ThreadLocalContextHolder.getData().toString();
|
||||||
|
out.write(msg);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
chain.doFilter(xssRequest, response);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void init(FilterConfig filterConfig) throws ServletException {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取request请求body中参数
|
||||||
|
public static String getBodyString(BufferedReader br) {
|
||||||
|
String inputLine;
|
||||||
|
String str = "";
|
||||||
|
try {
|
||||||
|
while ((inputLine = br.readLine()) != null) {
|
||||||
|
str += inputLine;
|
||||||
|
}
|
||||||
|
br.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
System.out.println("IOException: " + e);
|
||||||
|
}
|
||||||
|
return str;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,24 @@
|
|||||||
|
package io.dataease.commons.holder;
|
||||||
|
|
||||||
|
public class ThreadLocalContextHolder {
|
||||||
|
|
||||||
|
|
||||||
|
private static ThreadLocal<Object> sceneThreadLocal = new ThreadLocal<>();
|
||||||
|
|
||||||
|
|
||||||
|
public static Object getData() {
|
||||||
|
return sceneThreadLocal.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setData(Object data) {
|
||||||
|
if (ThreadLocalContextHolder.sceneThreadLocal == null) {
|
||||||
|
ThreadLocalContextHolder.sceneThreadLocal = new ThreadLocal<>();
|
||||||
|
}
|
||||||
|
ThreadLocalContextHolder.sceneThreadLocal.set(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void clearScene() {
|
||||||
|
setData(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,370 @@
|
|||||||
|
package io.dataease.commons.wrapper;
|
||||||
|
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.util.Enumeration;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.Vector;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
import javax.servlet.ReadListener;
|
||||||
|
import javax.servlet.ServletInputStream;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletRequestWrapper;
|
||||||
|
|
||||||
|
import io.dataease.commons.holder.ThreadLocalContextHolder;
|
||||||
|
import org.springframework.util.StreamUtils;
|
||||||
|
|
||||||
|
|
||||||
|
public class XssAndSqlHttpServletRequestWrapper extends HttpServletRequestWrapper {
|
||||||
|
|
||||||
|
|
||||||
|
HttpServletRequest orgRequest = null;
|
||||||
|
private Map<String, String[]> parameterMap;
|
||||||
|
private final byte[] body; //用于保存读取body中数据
|
||||||
|
|
||||||
|
public XssAndSqlHttpServletRequestWrapper(HttpServletRequest request) throws IOException{
|
||||||
|
super(request);
|
||||||
|
orgRequest = request;
|
||||||
|
parameterMap = request.getParameterMap();
|
||||||
|
body = StreamUtils.copyToByteArray(request.getInputStream());
|
||||||
|
}
|
||||||
|
|
||||||
|
// 重写几个HttpServletRequestWrapper中的方法
|
||||||
|
/**
|
||||||
|
* 获取所有参数名
|
||||||
|
*
|
||||||
|
* @return 返回所有参数名
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Enumeration<String> getParameterNames() {
|
||||||
|
Vector<String> vector = new Vector<String>(parameterMap.keySet());
|
||||||
|
return vector.elements();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 覆盖getParameter方法,将参数名和参数值都做xss & sql过滤。<br/>
|
||||||
|
* 如果需要获得原始的值,则通过super.getParameterValues(name)来获取<br/>
|
||||||
|
* getParameterNames,getParameterValues和getParameterMap也可能需要覆盖
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String getParameter(String name) {
|
||||||
|
String[] results = parameterMap.get(name);
|
||||||
|
if (results == null || results.length <= 0)
|
||||||
|
return null;
|
||||||
|
else {
|
||||||
|
String value = results[0];
|
||||||
|
if (value != null) {
|
||||||
|
value = xssEncode(value);
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取指定参数名的所有值的数组,如:checkbox的所有数据 接收数组变量 ,如checkobx类型
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String[] getParameterValues(String name) {
|
||||||
|
String[] results = parameterMap.get(name);
|
||||||
|
if (results == null || results.length <= 0)
|
||||||
|
return null;
|
||||||
|
else {
|
||||||
|
int length = results.length;
|
||||||
|
for (int i = 0; i < length; i++) {
|
||||||
|
results[i] = xssEncode(results[i]);
|
||||||
|
}
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 覆盖getHeader方法,将参数名和参数值都做xss & sql过滤。<br/>
|
||||||
|
* 如果需要获得原始的值,则通过super.getHeaders(name)来获取<br/>
|
||||||
|
* getHeaderNames 也可能需要覆盖
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String getHeader(String name) {
|
||||||
|
|
||||||
|
String value = super.getHeader(xssEncode(name));
|
||||||
|
if (value != null) {
|
||||||
|
value = xssEncode(value);
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将容易引起xss & sql漏洞的半角字符直接替换成全角字符
|
||||||
|
*
|
||||||
|
* @param s
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private static String xssEncode(String s) {
|
||||||
|
if (s == null || s.isEmpty()) {
|
||||||
|
return s;
|
||||||
|
} else {
|
||||||
|
s = stripXSSAndSql(s);
|
||||||
|
}
|
||||||
|
StringBuilder sb = new StringBuilder(s.length() + 16);
|
||||||
|
for (int i = 0; i < s.length(); i++) {
|
||||||
|
char c = s.charAt(i);
|
||||||
|
switch (c) {
|
||||||
|
case '>':
|
||||||
|
sb.append(">");// 转义大于号
|
||||||
|
break;
|
||||||
|
case '<':
|
||||||
|
sb.append("<");// 转义小于号
|
||||||
|
break;
|
||||||
|
// case '\'':
|
||||||
|
// sb.append("'");// 转义单引号
|
||||||
|
// break;
|
||||||
|
// case '\"':
|
||||||
|
// sb.append(""");// 转义双引号
|
||||||
|
// break;
|
||||||
|
case '&':
|
||||||
|
sb.append("&");// 转义&
|
||||||
|
break;
|
||||||
|
case '#':
|
||||||
|
sb.append("#");// 转义#
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
sb.append(c);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取最原始的request
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public HttpServletRequest getOrgRequest() {
|
||||||
|
return orgRequest;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取最原始的request的静态方法
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static HttpServletRequest getOrgRequest(HttpServletRequest req) {
|
||||||
|
if (req instanceof XssAndSqlHttpServletRequestWrapper) {
|
||||||
|
return ((XssAndSqlHttpServletRequestWrapper) req).getOrgRequest();
|
||||||
|
}
|
||||||
|
|
||||||
|
return req;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* 防止xss跨脚本攻击(替换,根据实际情况调整)
|
||||||
|
*/
|
||||||
|
|
||||||
|
public static String stripXSSAndSql(String value) {
|
||||||
|
if (value != null) {
|
||||||
|
// NOTE: It's highly recommended to use the ESAPI library and
|
||||||
|
// uncomment the following line to
|
||||||
|
// avoid encoded attacks.
|
||||||
|
// value = ESAPI.encoder().canonicalize(value);
|
||||||
|
// Avoid null characters
|
||||||
|
/** value = value.replaceAll("", ""); ***/
|
||||||
|
// Avoid anything between script tags
|
||||||
|
Pattern scriptPattern = Pattern.compile(
|
||||||
|
"<[\r\n| | ]*script[\r\n| | ]*>(.*?)</[\r\n| | ]*script[\r\n| | ]*>", Pattern.CASE_INSENSITIVE);
|
||||||
|
value = scriptPattern.matcher(value).replaceAll("");
|
||||||
|
// Avoid anything in a
|
||||||
|
// src="http://www.yihaomen.com/article/java/..." type of
|
||||||
|
// e-xpression
|
||||||
|
scriptPattern = Pattern.compile("src[\r\n| | ]*=[\r\n| | ]*[\\\"|\\\'](.*?)[\\\"|\\\']",
|
||||||
|
Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
|
||||||
|
value = scriptPattern.matcher(value).replaceAll("");
|
||||||
|
// Remove any lonesome </script> tag
|
||||||
|
scriptPattern = Pattern.compile("</[\r\n| | ]*script[\r\n| | ]*>", Pattern.CASE_INSENSITIVE);
|
||||||
|
value = scriptPattern.matcher(value).replaceAll("");
|
||||||
|
// Remove any lonesome <script ...> tag
|
||||||
|
scriptPattern = Pattern.compile("<[\r\n| | ]*script(.*?)>",
|
||||||
|
Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
|
||||||
|
value = scriptPattern.matcher(value).replaceAll("");
|
||||||
|
// Avoid eval(...) expressions
|
||||||
|
scriptPattern = Pattern.compile("eval\\((.*?)\\)",
|
||||||
|
Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
|
||||||
|
value = scriptPattern.matcher(value).replaceAll("");
|
||||||
|
// Avoid e-xpression(...) expressions
|
||||||
|
scriptPattern = Pattern.compile("e-xpression\\((.*?)\\)",
|
||||||
|
Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
|
||||||
|
value = scriptPattern.matcher(value).replaceAll("");
|
||||||
|
// Avoid javascript:... expressions
|
||||||
|
scriptPattern = Pattern.compile("javascript[\r\n| | ]*:[\r\n| | ]*", Pattern.CASE_INSENSITIVE);
|
||||||
|
value = scriptPattern.matcher(value).replaceAll("");
|
||||||
|
// Avoid vbscript:... expressions
|
||||||
|
scriptPattern = Pattern.compile("vbscript[\r\n| | ]*:[\r\n| | ]*", Pattern.CASE_INSENSITIVE);
|
||||||
|
value = scriptPattern.matcher(value).replaceAll("");
|
||||||
|
// Avoid onload= expressions
|
||||||
|
scriptPattern = Pattern.compile("onload(.*?)=",
|
||||||
|
Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
|
||||||
|
value = scriptPattern.matcher(value).replaceAll("");
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean checkSqlInjection(Object obj){
|
||||||
|
Pattern pattern= Pattern.compile("(.*\\=.*\\-\\-.*)|(.*(\\+|\\-).*)|(.*\\w+(%|\\$|#|&)\\w+.*)|(.*\\|\\|.*)|(.*\\s+(and|or)\\s+.*)" +
|
||||||
|
"|(.*\\b(select|update|union|and|or|delete|insert|trancate|char|into|substr|ascii|declare|exec|count|master|into|drop|execute)\\b.*)");
|
||||||
|
Matcher matcher=pattern.matcher(obj.toString().toLowerCase());
|
||||||
|
return matcher.find();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static boolean checkXSSAndSql(String value) {
|
||||||
|
boolean flag = false;
|
||||||
|
|
||||||
|
if (value != null) {
|
||||||
|
boolean b = checkSqlInjection(value);
|
||||||
|
if(b) {
|
||||||
|
ThreadLocalContextHolder.setData("包含SQL注入的参数,请检查参数!");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// NOTE: It's highly recommended to use the ESAPI library and
|
||||||
|
// uncomment the following line to
|
||||||
|
// avoid encoded attacks.
|
||||||
|
// value = ESAPI.encoder().canonicalize(value);
|
||||||
|
// Avoid null characters
|
||||||
|
/** value = value.replaceAll("", ""); ***/
|
||||||
|
// Avoid anything between script tags
|
||||||
|
Pattern scriptPattern = Pattern.compile(
|
||||||
|
"<[\r\n| | ]*script[\r\n| | ]*>(.*?)</[\r\n| | ]*script[\r\n| | ]*>", Pattern.CASE_INSENSITIVE);
|
||||||
|
flag = scriptPattern.matcher(value).find();
|
||||||
|
if (flag) {
|
||||||
|
// threadLocal.set("包含XSS攻击脚本,请检查参数!");
|
||||||
|
return flag;
|
||||||
|
}
|
||||||
|
// Avoid anything in a
|
||||||
|
// src="http://www.yihaomen.com/article/java/..." type of
|
||||||
|
// e-xpression
|
||||||
|
scriptPattern = Pattern.compile("src[\r\n| | ]*=[\r\n| | ]*[\\\"|\\\'](.*?)[\\\"|\\\']",
|
||||||
|
Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
|
||||||
|
flag = scriptPattern.matcher(value).find();
|
||||||
|
if (flag) {
|
||||||
|
ThreadLocalContextHolder.setData("包含XSS攻击脚本,请检查参数!");
|
||||||
|
return flag;
|
||||||
|
}
|
||||||
|
// Remove any lonesome </script> tag
|
||||||
|
scriptPattern = Pattern.compile("</[\r\n| | ]*script[\r\n| | ]*>", Pattern.CASE_INSENSITIVE);
|
||||||
|
flag = scriptPattern.matcher(value).find();
|
||||||
|
if (flag) {
|
||||||
|
ThreadLocalContextHolder.setData("包含XSS攻击脚本,请检查参数!");
|
||||||
|
return flag;
|
||||||
|
}
|
||||||
|
// Remove any lonesome <script ...> tag
|
||||||
|
scriptPattern = Pattern.compile("<[\r\n| | ]*script(.*?)>",
|
||||||
|
Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
|
||||||
|
flag = scriptPattern.matcher(value).find();
|
||||||
|
if (flag) {
|
||||||
|
ThreadLocalContextHolder.setData("包含XSS攻击脚本,请检查参数!");
|
||||||
|
return flag;
|
||||||
|
}
|
||||||
|
// Avoid eval(...) expressions
|
||||||
|
scriptPattern = Pattern.compile("eval\\((.*?)\\)",
|
||||||
|
Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
|
||||||
|
flag = scriptPattern.matcher(value).find();
|
||||||
|
if (flag) {
|
||||||
|
ThreadLocalContextHolder.setData("包含XSS攻击脚本,请检查参数!");
|
||||||
|
return flag;
|
||||||
|
}
|
||||||
|
// Avoid e-xpression(...) expressions
|
||||||
|
scriptPattern = Pattern.compile("e-xpression\\((.*?)\\)",
|
||||||
|
Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
|
||||||
|
flag = scriptPattern.matcher(value).find();
|
||||||
|
if (flag) {
|
||||||
|
ThreadLocalContextHolder.setData("包含XSS攻击脚本,请检查参数!");
|
||||||
|
return flag;
|
||||||
|
}
|
||||||
|
// Avoid javascript:... expressions
|
||||||
|
scriptPattern = Pattern.compile("javascript[\r\n| | ]*:[\r\n| | ]*", Pattern.CASE_INSENSITIVE);
|
||||||
|
flag = scriptPattern.matcher(value).find();
|
||||||
|
if (flag) {
|
||||||
|
ThreadLocalContextHolder.setData("包含XSS攻击脚本,请检查参数!");
|
||||||
|
return flag;
|
||||||
|
}
|
||||||
|
// Avoid vbscript:... expressions
|
||||||
|
scriptPattern = Pattern.compile("vbscript[\r\n| | ]*:[\r\n| | ]*", Pattern.CASE_INSENSITIVE);
|
||||||
|
flag = scriptPattern.matcher(value).find();
|
||||||
|
if (flag) {
|
||||||
|
ThreadLocalContextHolder.setData("包含XSS攻击脚本,请检查参数!");
|
||||||
|
return flag;
|
||||||
|
}
|
||||||
|
// Avoid onload= expressions
|
||||||
|
scriptPattern = Pattern.compile("onload(.*?)=",
|
||||||
|
Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
|
||||||
|
flag = scriptPattern.matcher(value).find();
|
||||||
|
if (flag) {
|
||||||
|
ThreadLocalContextHolder.setData("包含XSS攻击脚本,请检查参数!");
|
||||||
|
return flag;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return flag;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final boolean checkParameter() {
|
||||||
|
Map<String, String[]> submitParams = new HashMap(parameterMap);
|
||||||
|
Set<String> submitNames = submitParams.keySet();
|
||||||
|
for (String submitName : submitNames) {
|
||||||
|
Object submitValues = submitParams.get(submitName);
|
||||||
|
if ((submitValues instanceof String)) {
|
||||||
|
if (checkXSSAndSql((String) submitValues)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} else if ((submitValues instanceof String[])) {
|
||||||
|
for (String submitValue : (String[])submitValues){
|
||||||
|
if (checkXSSAndSql(submitValue)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BufferedReader getReader() throws IOException {
|
||||||
|
return new BufferedReader(new InputStreamReader(getInputStream()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ServletInputStream getInputStream() throws IOException {
|
||||||
|
final ByteArrayInputStream bais = new ByteArrayInputStream(body);
|
||||||
|
return new ServletInputStream() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int read() throws IOException {
|
||||||
|
return bais.read();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isFinished() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isReady() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setReadListener(ReadListener arg0) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
21
backend/src/main/java/io/dataease/config/FilterConfig.java
Normal file
21
backend/src/main/java/io/dataease/config/FilterConfig.java
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
package io.dataease.config;
|
||||||
|
|
||||||
|
import io.dataease.commons.filter.SqlFilter;
|
||||||
|
import org.springframework.boot.web.servlet.FilterRegistrationBean;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
public class FilterConfig {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public FilterRegistrationBean registration(){
|
||||||
|
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
|
||||||
|
filterRegistrationBean.setFilter(new SqlFilter());//实例化Filter类
|
||||||
|
filterRegistrationBean.addUrlPatterns("/*");//设置匹配模式,这里设置为所有,可以按需求设置为"/hello"等等
|
||||||
|
filterRegistrationBean.setName("SqlFilter");//设置过滤器名称
|
||||||
|
filterRegistrationBean.setOrder(1);//设置执行顺序
|
||||||
|
return filterRegistrationBean;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
20
backend/src/main/java/io/dataease/config/WebMvcConfig.java
Normal file
20
backend/src/main/java/io/dataease/config/WebMvcConfig.java
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
package io.dataease.config;
|
||||||
|
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
|
||||||
|
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
public class WebMvcConfig implements WebMvcConfigurer {
|
||||||
|
|
||||||
|
@Value("${geo.rootpath:file:/opt/dataease/data/feature/full/}")
|
||||||
|
private String geoPath;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addResourceHandlers(ResourceHandlerRegistry registry) {
|
||||||
|
|
||||||
|
registry.addResourceHandler("/geo/**").addResourceLocations(geoPath);
|
||||||
|
}
|
||||||
|
}
|
@ -66,7 +66,7 @@ public class DataSetTableTaskController {
|
|||||||
|
|
||||||
@ApiOperation("更新状态")
|
@ApiOperation("更新状态")
|
||||||
@PostMapping("/updateStatus")
|
@PostMapping("/updateStatus")
|
||||||
public void updateStatus(@RequestBody DatasetTableTask datasetTableTask) {
|
public void updateStatus(@RequestBody DatasetTableTask datasetTableTask) throws Exception{
|
||||||
dataSetTableTaskService.updateDatasetTableTaskStatus(datasetTableTask);
|
dataSetTableTaskService.updateDatasetTableTaskStatus(datasetTableTask);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -494,7 +494,12 @@ public class ChartViewService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (StringUtils.equals(a.toString(), x.get(i))) {
|
if (StringUtils.equals(a.toString(), x.get(i))) {
|
||||||
ss.getData().set(i, new BigDecimal(row[xAxis.size() + extStack.size()]));
|
if (row.length > xAxis.size() + extStack.size()) {
|
||||||
|
String s = row[xAxis.size() + extStack.size()];
|
||||||
|
if (StringUtils.isNotEmpty(s)) {
|
||||||
|
ss.getData().set(i, new BigDecimal(s));
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,6 @@ import io.dataease.base.domain.*;
|
|||||||
import io.dataease.base.mapper.DatasetTableMapper;
|
import io.dataease.base.mapper.DatasetTableMapper;
|
||||||
import io.dataease.base.mapper.DatasetTableTaskMapper;
|
import io.dataease.base.mapper.DatasetTableTaskMapper;
|
||||||
import io.dataease.base.mapper.ext.ExtDataSetTaskMapper;
|
import io.dataease.base.mapper.ext.ExtDataSetTaskMapper;
|
||||||
import io.dataease.base.mapper.ext.UtilMapper;
|
|
||||||
import io.dataease.base.mapper.ext.query.GridExample;
|
import io.dataease.base.mapper.ext.query.GridExample;
|
||||||
import io.dataease.commons.constants.JobStatus;
|
import io.dataease.commons.constants.JobStatus;
|
||||||
import io.dataease.commons.constants.ScheduleType;
|
import io.dataease.commons.constants.ScheduleType;
|
||||||
@ -52,8 +51,6 @@ public class DataSetTableTaskService {
|
|||||||
private ExtDataSetTaskMapper extDataSetTaskMapper;
|
private ExtDataSetTaskMapper extDataSetTaskMapper;
|
||||||
@Resource
|
@Resource
|
||||||
private DatasetTableMapper datasetTableMapper;
|
private DatasetTableMapper datasetTableMapper;
|
||||||
@Resource
|
|
||||||
private UtilMapper utilMapper;
|
|
||||||
|
|
||||||
public DatasetTableTask save(DataSetTaskRequest dataSetTaskRequest) throws Exception {
|
public DatasetTableTask save(DataSetTaskRequest dataSetTaskRequest) throws Exception {
|
||||||
checkName(dataSetTaskRequest);
|
checkName(dataSetTaskRequest);
|
||||||
@ -95,12 +92,15 @@ public class DataSetTableTaskService {
|
|||||||
datasetTableTaskMapper.updateByPrimaryKeySelective(datasetTableTask);
|
datasetTableTaskMapper.updateByPrimaryKeySelective(datasetTableTask);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
scheduleService.addSchedule(datasetTableTask);
|
||||||
|
|
||||||
// simple
|
// simple
|
||||||
if (datasetTableTask.getRate().equalsIgnoreCase(ScheduleType.SIMPLE.toString())) { // SIMPLE 类型,提前占位
|
if (datasetTableTask.getRate().equalsIgnoreCase(ScheduleType.SIMPLE.toString())) { // SIMPLE 类型,提前占位
|
||||||
execNow(datasetTableTask);
|
execNow(datasetTableTask);
|
||||||
|
}else {
|
||||||
|
checkTaskIsStopped(datasetTableTask);
|
||||||
}
|
}
|
||||||
scheduleService.addSchedule(datasetTableTask);
|
|
||||||
checkTaskIsStopped(datasetTableTask);
|
|
||||||
return datasetTableTask;
|
return datasetTableTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -281,7 +281,13 @@ public class DataSetTableTaskService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateDatasetTableTaskStatus(DatasetTableTask datasetTableTask){
|
public void updateDatasetTableTaskStatus(DatasetTableTask datasetTableTask)throws Exception{
|
||||||
|
|
||||||
|
DatasetTableTask dbDatasetTableTask = datasetTableTaskMapper.selectByPrimaryKey(datasetTableTask.getId());
|
||||||
|
if(dbDatasetTableTask.getStatus().equalsIgnoreCase(TaskStatus.Exec.name()) || dbDatasetTableTask.getStatus().equals(TaskStatus.Stopped.name())){
|
||||||
|
throw new Exception(Translator.get("i18n_change_task_status_error") + Translator.get("i18n_" + dbDatasetTableTask.getStatus()));
|
||||||
|
}
|
||||||
|
|
||||||
DatasetTableTaskExample datasetTableTaskExample = new DatasetTableTaskExample();
|
DatasetTableTaskExample datasetTableTaskExample = new DatasetTableTaskExample();
|
||||||
DatasetTableTaskExample.Criteria criteria = datasetTableTaskExample.createCriteria();
|
DatasetTableTaskExample.Criteria criteria = datasetTableTaskExample.createCriteria();
|
||||||
criteria.andIdEqualTo(datasetTableTask.getId());
|
criteria.andIdEqualTo(datasetTableTask.getId());
|
||||||
|
@ -283,7 +283,7 @@ public class ExtractDataService {
|
|||||||
createDorisTable(DorisTableUtils.dorisTmpName(DorisTableUtils.dorisName(datasetTableId)), dorisTablColumnSql);
|
createDorisTable(DorisTableUtils.dorisTmpName(DorisTableUtils.dorisName(datasetTableId)), dorisTablColumnSql);
|
||||||
generateTransFile("all_scope", datasetTable, datasource, datasetTableFields, null);
|
generateTransFile("all_scope", datasetTable, datasource, datasetTableFields, null);
|
||||||
if (datasetTable.getType().equalsIgnoreCase("sql")) {
|
if (datasetTable.getType().equalsIgnoreCase("sql")) {
|
||||||
generateJobFile("all_scope", datasetTable, fetchSqlField(new Gson().fromJson(datasetTable.getInfo(), DataTableInfoDTO.class).getSql(), datasource));
|
generateJobFile("all_scope", datasetTable, String.join(",", datasetTableFields.stream().map(DatasetTableField::getDataeaseName).collect(Collectors.toList())));
|
||||||
} else {
|
} else {
|
||||||
generateJobFile("all_scope", datasetTable, String.join(",", datasetTableFields.stream().map(DatasetTableField::getDataeaseName).collect(Collectors.toList())));
|
generateJobFile("all_scope", datasetTable, String.join(",", datasetTableFields.stream().map(DatasetTableField::getDataeaseName).collect(Collectors.toList())));
|
||||||
}
|
}
|
||||||
@ -297,6 +297,7 @@ public class ExtractDataService {
|
|||||||
saveErrorLog(datasetTableId, taskId, e);
|
saveErrorLog(datasetTableId, taskId, e);
|
||||||
msg = false;
|
msg = false;
|
||||||
lastExecStatus = JobStatus.Error;
|
lastExecStatus = JobStatus.Error;
|
||||||
|
execTime = null;
|
||||||
} finally {
|
} finally {
|
||||||
try { deleteFile("all_scope", datasetTableId); }catch (Exception ignore){ System.out.println(ignore.getMessage());}
|
try { deleteFile("all_scope", datasetTableId); }catch (Exception ignore){ System.out.println(ignore.getMessage());}
|
||||||
try { sendWebMsg(datasetTable, datasetTableTask, datasetTableTaskLog, msg); }catch (Exception ignore){ System.out.println(ignore.getMessage());}
|
try { sendWebMsg(datasetTable, datasetTableTask, datasetTableTaskLog, msg); }catch (Exception ignore){ System.out.println(ignore.getMessage());}
|
||||||
@ -316,14 +317,17 @@ public class ExtractDataService {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (datasetTable.getLastUpdateTime() == 0 || datasetTable.getLastUpdateTime() == null) {
|
|
||||||
updateTableStatus(datasetTableId, datasetTable, JobStatus.Completed, null);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (datasetTableTask == null ) {
|
if (datasetTableTask == null ) {
|
||||||
datasetTableTaskLog = writeDatasetTableTaskLog(datasetTableId, taskId);
|
datasetTableTaskLog = writeDatasetTableTaskLog(datasetTableId, taskId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (datasetTable.getLastUpdateTime() == null || datasetTable.getLastUpdateTime() == 0) {
|
||||||
|
updateTableStatus(datasetTableId, datasetTable, JobStatus.Completed, null);
|
||||||
|
saveErrorLog(datasetTableId, taskId, new Exception("未进行全量同步"));
|
||||||
|
lastExecStatus = JobStatus.Error;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
execTime = System.currentTimeMillis();
|
execTime = System.currentTimeMillis();
|
||||||
if (StringUtils.isNotEmpty(datasetTableIncrementalConfig.getIncrementalAdd()) && StringUtils.isNotEmpty(datasetTableIncrementalConfig.getIncrementalAdd().replace(" ", ""))) {// 增量添加
|
if (StringUtils.isNotEmpty(datasetTableIncrementalConfig.getIncrementalAdd()) && StringUtils.isNotEmpty(datasetTableIncrementalConfig.getIncrementalAdd().replace(" ", ""))) {// 增量添加
|
||||||
String sql = datasetTableIncrementalConfig.getIncrementalAdd().replace(lastUpdateTime, datasetTable.getLastUpdateTime().toString())
|
String sql = datasetTableIncrementalConfig.getIncrementalAdd().replace(lastUpdateTime, datasetTable.getLastUpdateTime().toString())
|
||||||
@ -348,6 +352,7 @@ public class ExtractDataService {
|
|||||||
saveErrorLog(datasetTableId, taskId, e);
|
saveErrorLog(datasetTableId, taskId, e);
|
||||||
msg = false;
|
msg = false;
|
||||||
lastExecStatus = JobStatus.Error;
|
lastExecStatus = JobStatus.Error;
|
||||||
|
execTime = null;
|
||||||
} finally {
|
} finally {
|
||||||
try { deleteFile("incremental_add", datasetTableId); deleteFile("incremental_delete", datasetTableId); }catch (Exception ignore){}
|
try { deleteFile("incremental_add", datasetTableId); deleteFile("incremental_delete", datasetTableId); }catch (Exception ignore){}
|
||||||
try { sendWebMsg(datasetTable, datasetTableTask, datasetTableTaskLog, msg); }catch (Exception ignore){}
|
try { sendWebMsg(datasetTable, datasetTableTask, datasetTableTaskLog, msg); }catch (Exception ignore){}
|
||||||
|
@ -3012,7 +3012,7 @@ INSERT INTO `dataset_table_function` VALUES (43, 'CURRENT_TIMESTAMP', 'CURRENT_T
|
|||||||
INSERT INTO `dataset_table_function` VALUES (44, 'UNIX_TIMESTAMP', 'UNIX_TIMESTAMP()', 'mysql', 3, '返回一个格林尼治标准时间1970-01-01 00:00:00到现在的秒数');
|
INSERT INTO `dataset_table_function` VALUES (44, 'UNIX_TIMESTAMP', 'UNIX_TIMESTAMP()', 'mysql', 3, '返回一个格林尼治标准时间1970-01-01 00:00:00到现在的秒数');
|
||||||
INSERT INTO `dataset_table_function` VALUES (45, 'UNIX_TIMESTAMP', 'UNIX_TIMESTAMP(date)', 'mysql', 3, '返回一个格林尼治标准时间1970-01-01 00:00:00到指定时间的秒数');
|
INSERT INTO `dataset_table_function` VALUES (45, 'UNIX_TIMESTAMP', 'UNIX_TIMESTAMP(date)', 'mysql', 3, '返回一个格林尼治标准时间1970-01-01 00:00:00到指定时间的秒数');
|
||||||
INSERT INTO `dataset_table_function` VALUES (46, 'FROM_UNIXTIME', 'FROM_UNIXTIME(date)', 'mysql', 3, '把UNIX时间戳转换为普通格式的时间');
|
INSERT INTO `dataset_table_function` VALUES (46, 'FROM_UNIXTIME', 'FROM_UNIXTIME(date)', 'mysql', 3, '把UNIX时间戳转换为普通格式的时间');
|
||||||
INSERT INTO `dataset_table_function` VALUES (47, 'CASE', 'CASE expr WHEN v1 THEN r1 [WHEN v2 THEN v2] [ELSE rn] END', 'mysql', 3, '如果expr等于某个vn,则返回对应位置THEN后面的结果,如果与所有值都不想等,则返回ELSE后面的rn');
|
INSERT INTO `dataset_table_function` VALUES (47, 'CASE', 'CASE expr WHEN v1 THEN r1 [WHEN v2 THEN v2] [ELSE rn] END', 'mysql', 5, '如果expr等于某个vn,则返回对应位置THEN后面的结果,如果与所有值都不想等,则返回ELSE后面的rn');
|
||||||
INSERT INTO `dataset_table_function` VALUES (48, 'IF', 'IF(expr,v1,v2)', 'mysql', 5, '如果expr是TRUE则返回v1,否则返回v2');
|
INSERT INTO `dataset_table_function` VALUES (48, 'IF', 'IF(expr,v1,v2)', 'mysql', 5, '如果expr是TRUE则返回v1,否则返回v2');
|
||||||
INSERT INTO `dataset_table_function` VALUES (49, 'IFNULL', 'IFNULL(v1,v2)', 'mysql', 5, '如果v1不为NULL,则返回v1,否则返回v2');
|
INSERT INTO `dataset_table_function` VALUES (49, 'IFNULL', 'IFNULL(v1,v2)', 'mysql', 5, '如果v1不为NULL,则返回v1,否则返回v2');
|
||||||
INSERT INTO `dataset_table_function` VALUES (50, 'ABS', 'ABS(x)', 'doris', 2, '返回x的绝对值');
|
INSERT INTO `dataset_table_function` VALUES (50, 'ABS', 'ABS(x)', 'doris', 2, '返回x的绝对值');
|
||||||
|
@ -278,3 +278,6 @@ i18n_excel_colume_change=The column name of Excel is inconsistent with the origi
|
|||||||
i18n_timed_task=Timed Task
|
i18n_timed_task=Timed Task
|
||||||
i18n_datasource_connect_error=Data source connection exception:
|
i18n_datasource_connect_error=Data source connection exception:
|
||||||
i18n_check_sql_error=Check incremental SQL exception,
|
i18n_check_sql_error=Check incremental SQL exception,
|
||||||
|
i18n_change_task_status_error=Suspension is not allowed. The task status is:
|
||||||
|
i18n_Stopped=END
|
||||||
|
i18n_Exec=Running
|
@ -277,3 +277,7 @@ i18n_excel_colume_change=Excel的列名与原数据集不一致
|
|||||||
i18n_timed_task=定时任务
|
i18n_timed_task=定时任务
|
||||||
i18n_datasource_connect_error=数据源连接异常:
|
i18n_datasource_connect_error=数据源连接异常:
|
||||||
i18n_check_sql_error=校验增量 SQL 异常,
|
i18n_check_sql_error=校验增量 SQL 异常,
|
||||||
|
i18n_change_task_status_error=不允许暂停,任务状态为:
|
||||||
|
i18n_Stopped=执行结束
|
||||||
|
i18n_Exec=运行中
|
||||||
|
|
||||||
|
@ -280,3 +280,6 @@ i18n_excel_colume_change=Excel的列名與原數據集不一致
|
|||||||
i18n_timed_task=定時任務
|
i18n_timed_task=定時任務
|
||||||
i18n_datasource_connect_error=數據源連接異常:
|
i18n_datasource_connect_error=數據源連接異常:
|
||||||
i18n_check_sql_error=校驗增量SQL異常,
|
i18n_check_sql_error=校驗增量SQL異常,
|
||||||
|
i18n_change_task_status_error=不允許暫停,任務狀態為:
|
||||||
|
i18n_Stopped=執行結束
|
||||||
|
i18n_Exec=運行中
|
@ -8,9 +8,17 @@ export const areaMapping = () => {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// export function geoJson(areaCode) {
|
||||||
|
// return request({
|
||||||
|
// url: '/api/map/resourceFull/' + areaCode,
|
||||||
|
// method: 'get',
|
||||||
|
// loading: true
|
||||||
|
// })
|
||||||
|
// }
|
||||||
|
|
||||||
export function geoJson(areaCode) {
|
export function geoJson(areaCode) {
|
||||||
return request({
|
return request({
|
||||||
url: '/api/map/resourceFull/' + areaCode,
|
url: '/geo/' + areaCode + '_full.json',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
loading: true
|
loading: true
|
||||||
})
|
})
|
||||||
|
@ -19,9 +19,7 @@
|
|||||||
@mouseenter="enter"
|
@mouseenter="enter"
|
||||||
@mouseleave="leave"
|
@mouseleave="leave"
|
||||||
>
|
>
|
||||||
<setting-menu style="right:5px;position: absolute;z-index: 2">
|
<edit-bar v-if="active||linkageSettingStatus" :active-model="'edit'" :element="element" @showViewDetails="showViewDetails" />
|
||||||
<i slot="icon" class="icon iconfont icon-shezhi" />
|
|
||||||
</setting-menu>
|
|
||||||
<div
|
<div
|
||||||
v-for="(handlei, indexi) in actualHandles"
|
v-for="(handlei, indexi) in actualHandles"
|
||||||
:key="indexi"
|
:key="indexi"
|
||||||
@ -46,11 +44,12 @@ let eventsFor = events.mouse
|
|||||||
import eventBus from '@/components/canvas/utils/eventBus'
|
import eventBus from '@/components/canvas/utils/eventBus'
|
||||||
import { mapState } from 'vuex'
|
import { mapState } from 'vuex'
|
||||||
import SettingMenu from '@/components/canvas/components/Editor/SettingMenu'
|
import SettingMenu from '@/components/canvas/components/Editor/SettingMenu'
|
||||||
|
import EditBar from '@/components/canvas/components/Editor/EditBar'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
replace: true,
|
replace: true,
|
||||||
name: 'VueDragResizeRotate',
|
name: 'VueDragResizeRotate',
|
||||||
components: { SettingMenu },
|
components: { EditBar },
|
||||||
props: {
|
props: {
|
||||||
className: {
|
className: {
|
||||||
type: String,
|
type: String,
|
||||||
@ -464,7 +463,8 @@ export default {
|
|||||||
'curComponent',
|
'curComponent',
|
||||||
'editor',
|
'editor',
|
||||||
'curCanvasScale',
|
'curCanvasScale',
|
||||||
'canvasStyleData'
|
'canvasStyleData',
|
||||||
|
'linkageSettingStatus'
|
||||||
])
|
])
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
@ -1540,6 +1540,9 @@ export default {
|
|||||||
removeEvent(document.documentElement, 'mouseup', this.handleUp)
|
removeEvent(document.documentElement, 'mouseup', this.handleUp)
|
||||||
removeEvent(document.documentElement, 'touchend touchcancel', this.deselect)
|
removeEvent(document.documentElement, 'touchend touchcancel', this.deselect)
|
||||||
removeEvent(window, 'resize', this.checkParentSize)
|
removeEvent(window, 'resize', this.checkParentSize)
|
||||||
|
},
|
||||||
|
showViewDetails() {
|
||||||
|
this.$emit('showViewDetails')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1628,26 +1631,26 @@ export default {
|
|||||||
user-select: none;
|
user-select: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.mouseOn >>> .icon-shezhi{
|
/*.mouseOn >>> .icon-shezhi{*/
|
||||||
z-index: 2;
|
/* z-index: 2;*/
|
||||||
display:block!important;
|
/* display:block!important;*/
|
||||||
}
|
/*}*/
|
||||||
.vdr > i{
|
/*.vdr > i{*/
|
||||||
right: 5px;
|
/* right: 5px;*/
|
||||||
color: gray;
|
/* color: gray;*/
|
||||||
position: absolute;
|
/* position: absolute;*/
|
||||||
}
|
/*}*/
|
||||||
|
|
||||||
.vdr >>> i:hover {
|
/*.vdr >>> i:hover {*/
|
||||||
color: red;
|
/* color: red;*/
|
||||||
}
|
/*}*/
|
||||||
|
|
||||||
.vdr:hover >>> i {
|
/*.vdr:hover >>> i {*/
|
||||||
z-index: 2;
|
/* z-index: 2;*/
|
||||||
display:block;
|
/* display:block;*/
|
||||||
}
|
/*}*/
|
||||||
|
|
||||||
.vdr>>>.icon-shezhi {
|
/*.vdr>>>.icon-shezhi {*/
|
||||||
display:none
|
/* display:none*/
|
||||||
}
|
/*}*/
|
||||||
</style>
|
</style>
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
@click="handleClick"
|
@click="handleClick"
|
||||||
@mousedown="elementMouseDown"
|
@mousedown="elementMouseDown"
|
||||||
>
|
>
|
||||||
<edit-bar v-if="config === curComponent" @showViewDetails="showViewDetails" />
|
<edit-bar v-if="config === curComponent" :element="config" @showViewDetails="showViewDetails" />
|
||||||
<de-out-widget
|
<de-out-widget
|
||||||
v-if="config.type==='custom'"
|
v-if="config.type==='custom'"
|
||||||
:id="'component' + config.id"
|
:id="'component' + config.id"
|
||||||
@ -18,9 +18,9 @@
|
|||||||
/>
|
/>
|
||||||
|
|
||||||
<component
|
<component
|
||||||
ref="wrapperChild"
|
|
||||||
:is="config.component"
|
:is="config.component"
|
||||||
v-else
|
v-else
|
||||||
|
ref="wrapperChild"
|
||||||
:out-style="config.style"
|
:out-style="config.style"
|
||||||
:style="getComponentStyleDefault(config.style)"
|
:style="getComponentStyleDefault(config.style)"
|
||||||
:prop-value="config.propValue"
|
:prop-value="config.propValue"
|
||||||
@ -112,8 +112,8 @@ export default {
|
|||||||
e.stopPropagation()
|
e.stopPropagation()
|
||||||
this.$store.commit('setCurComponent', { component: this.config, index: this.index })
|
this.$store.commit('setCurComponent', { component: this.config, index: this.index })
|
||||||
},
|
},
|
||||||
showViewDetails(){
|
showViewDetails() {
|
||||||
this.$refs.wrapperChild.openChartDetailsDialog();
|
this.$refs.wrapperChild.openChartDetailsDialog()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,17 +1,34 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="bar-main">
|
<div class="bar-main">
|
||||||
<i v-if="curComponent.type==='view'" class="icon iconfont icon-fangda" @click.stop="showViewDetails" />
|
<div v-if="linkageSettingStatus" style="margin-right: -1px;width: 18px">
|
||||||
<i v-if="activeModel==='edit'" class="icon iconfont icon-shezhi" @click.stop="showViewDetails" />
|
<el-checkbox v-model="linkageActiveStatus" />
|
||||||
|
<i v-if="linkageActiveStatus" class="icon iconfont icon-edit" @click.stop="linkageEdit" />
|
||||||
|
</div>
|
||||||
|
<div v-else>
|
||||||
|
<setting-menu v-if="activeModel==='edit'" style="float: right;height: 24px!important;">
|
||||||
|
<i slot="icon" class="icon iconfont icon-shezhi" />
|
||||||
|
</setting-menu>
|
||||||
|
<i v-if="activeModel==='edit'&&curComponent&&editFilter.includes(curComponent.type)" class="icon iconfont icon-edit" @click.stop="edit" />
|
||||||
|
<i v-if="curComponent.type==='view'" class="icon iconfont icon-fangda" @click.stop="showViewDetails" />
|
||||||
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { mapState } from 'vuex'
|
import { mapState } from 'vuex'
|
||||||
import eventBus from '@/components/canvas/utils/eventBus'
|
import eventBus from '@/components/canvas/utils/eventBus'
|
||||||
|
import bus from '@/utils/bus'
|
||||||
|
import SettingMenu from '@/components/canvas/components/Editor/SettingMenu'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
components: { SettingMenu },
|
||||||
|
|
||||||
props: {
|
props: {
|
||||||
|
element: {
|
||||||
|
type: Object,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
active: {
|
active: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
required: false,
|
required: false,
|
||||||
@ -27,6 +44,7 @@ export default {
|
|||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
componentType: null,
|
componentType: null,
|
||||||
|
linkageActiveStatus: false,
|
||||||
editFilter: [
|
editFilter: [
|
||||||
'view',
|
'view',
|
||||||
'custom'
|
'custom'
|
||||||
@ -39,11 +57,34 @@ export default {
|
|||||||
'menuShow',
|
'menuShow',
|
||||||
'curComponent',
|
'curComponent',
|
||||||
'componentData',
|
'componentData',
|
||||||
'canvasStyleData'
|
'canvasStyleData',
|
||||||
|
'linkageSettingStatus'
|
||||||
]),
|
]),
|
||||||
methods: {
|
methods: {
|
||||||
showViewDetails() {
|
showViewDetails() {
|
||||||
this.$emit('showViewDetails')
|
this.$emit('showViewDetails')
|
||||||
|
},
|
||||||
|
edit() {
|
||||||
|
// 编辑时临时保存 当前修改的画布
|
||||||
|
this.$store.dispatch('panel/setComponentDataTemp', JSON.stringify(this.componentData))
|
||||||
|
this.$store.dispatch('panel/setCanvasStyleDataTemp', JSON.stringify(this.canvasStyleData))
|
||||||
|
if (this.curComponent.type === 'view') {
|
||||||
|
this.$store.dispatch('chart/setViewId', null)
|
||||||
|
this.$store.dispatch('chart/setViewId', this.curComponent.propValue.viewId)
|
||||||
|
bus.$emit('PanelSwitchComponent', { name: 'ChartEdit', param: { 'id': this.curComponent.propValue.viewId, 'optType': 'edit' }})
|
||||||
|
}
|
||||||
|
if (this.curComponent.type === 'custom') {
|
||||||
|
bus.$emit('component-dialog-edit')
|
||||||
|
}
|
||||||
|
|
||||||
|
// 编辑样式组件
|
||||||
|
|
||||||
|
if (this.curComponent.type === 'v-text' || this.curComponent.type === 'rect-shape') {
|
||||||
|
bus.$emit('component-dialog-style')
|
||||||
|
}
|
||||||
|
},
|
||||||
|
linkageEdit() {
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -153,6 +153,7 @@ export default {
|
|||||||
this.searchCount++
|
this.searchCount++
|
||||||
}, refreshTime)
|
}, refreshTime)
|
||||||
eventBus.$on('openChartDetailsDialog', this.openChartDetailsDialog)
|
eventBus.$on('openChartDetailsDialog', this.openChartDetailsDialog)
|
||||||
|
this.$store.commit('setLinkageSettingStatus', false)
|
||||||
},
|
},
|
||||||
beforeDestroy() {
|
beforeDestroy() {
|
||||||
clearInterval(this.timer)
|
clearInterval(this.timer)
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
@mousedown="handleMouseDown"
|
@mousedown="handleMouseDown"
|
||||||
>
|
>
|
||||||
<!-- 网格线 -->
|
<!-- 网格线 -->
|
||||||
<Grid v-if="canvasStyleData.auxiliaryMatrix" :matrix-style="matrixStyle" />
|
<Grid v-if="canvasStyleData.auxiliaryMatrix&&!linkageSettingStatus" :matrix-style="matrixStyle" />
|
||||||
<!--页面组件列表展示-->
|
<!--页面组件列表展示-->
|
||||||
<de-drag
|
<de-drag
|
||||||
v-for="(item, index) in componentData"
|
v-for="(item, index) in componentData"
|
||||||
@ -29,12 +29,15 @@
|
|||||||
:snap="true"
|
:snap="true"
|
||||||
:snap-tolerance="2"
|
:snap-tolerance="2"
|
||||||
:change-style="customStyle"
|
:change-style="customStyle"
|
||||||
|
:draggable="!linkageSettingStatus"
|
||||||
@refLineParams="getRefLineParams"
|
@refLineParams="getRefLineParams"
|
||||||
|
@showViewDetails="showViewDetails(index)"
|
||||||
>
|
>
|
||||||
<component
|
<component
|
||||||
:is="item.component"
|
:is="item.component"
|
||||||
v-if="item.type==='v-text'"
|
v-if="item.type==='v-text'"
|
||||||
:id="'component' + item.id"
|
:id="'component' + item.id"
|
||||||
|
ref="wrapperChild"
|
||||||
class="component"
|
class="component"
|
||||||
:style="getComponentStyleDefault(item.style)"
|
:style="getComponentStyleDefault(item.style)"
|
||||||
:prop-value="item.propValue"
|
:prop-value="item.propValue"
|
||||||
@ -69,6 +72,7 @@
|
|||||||
:is="item.component"
|
:is="item.component"
|
||||||
v-else-if="item.type==='other'"
|
v-else-if="item.type==='other'"
|
||||||
:id="'component' + item.id"
|
:id="'component' + item.id"
|
||||||
|
ref="wrapperChild"
|
||||||
class="component"
|
class="component"
|
||||||
:style="getComponentStyle(item.style)"
|
:style="getComponentStyle(item.style)"
|
||||||
:prop-value="item.propValue"
|
:prop-value="item.propValue"
|
||||||
@ -80,6 +84,7 @@
|
|||||||
:is="item.component"
|
:is="item.component"
|
||||||
v-else
|
v-else
|
||||||
:id="'component' + item.id"
|
:id="'component' + item.id"
|
||||||
|
ref="wrapperChild"
|
||||||
class="component"
|
class="component"
|
||||||
:style="getComponentStyleDefault(item.style)"
|
:style="getComponentStyleDefault(item.style)"
|
||||||
:prop-value="item.propValue"
|
:prop-value="item.propValue"
|
||||||
@ -245,7 +250,8 @@ export default {
|
|||||||
'componentData',
|
'componentData',
|
||||||
'curComponent',
|
'curComponent',
|
||||||
'canvasStyleData',
|
'canvasStyleData',
|
||||||
'editor'
|
'editor',
|
||||||
|
'linkageSettingStatus'
|
||||||
])
|
])
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
@ -603,6 +609,9 @@ export default {
|
|||||||
},
|
},
|
||||||
exportExcel() {
|
exportExcel() {
|
||||||
this.$refs['userViewDialog'].exportExcel()
|
this.$refs['userViewDialog'].exportExcel()
|
||||||
|
},
|
||||||
|
showViewDetails(index) {
|
||||||
|
this.$refs.wrapperChild[index].openChartDetailsDialog()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,17 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<div class="toolbar">
|
<!-- linkageActiveStatus:{{ linkageActiveStatus }}-->
|
||||||
|
<div v-if="linkageSettingStatus" class="toolbar">
|
||||||
|
<span style="float: right;">
|
||||||
|
<el-button size="mini" @click="saveLinkage">
|
||||||
|
{{ $t('commons.confirm') }}
|
||||||
|
</el-button>
|
||||||
|
<el-button size="mini" @click="cancelLinkage">
|
||||||
|
{{ $t('commons.cancel') }}
|
||||||
|
</el-button>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div v-else class="toolbar">
|
||||||
|
|
||||||
<div class="canvas-config" style="margin-right: 10px">
|
<div class="canvas-config" style="margin-right: 10px">
|
||||||
<el-switch v-model="canvasStyleData.auxiliaryMatrix" :width="35" name="auxiliaryMatrix" />
|
<el-switch v-model="canvasStyleData.auxiliaryMatrix" :width="35" name="auxiliaryMatrix" />
|
||||||
@ -125,7 +136,8 @@ export default {
|
|||||||
'curComponent',
|
'curComponent',
|
||||||
'changeTimes',
|
'changeTimes',
|
||||||
'snapshotIndex',
|
'snapshotIndex',
|
||||||
'lastSaveSnapshotIndex'
|
'lastSaveSnapshotIndex',
|
||||||
|
'linkageSettingStatus'
|
||||||
]),
|
]),
|
||||||
|
|
||||||
created() {
|
created() {
|
||||||
@ -302,6 +314,15 @@ export default {
|
|||||||
},
|
},
|
||||||
closeNotSave() {
|
closeNotSave() {
|
||||||
this.close()
|
this.close()
|
||||||
|
},
|
||||||
|
saveLinkage() {
|
||||||
|
this.cancelLinkageSettingStatus()
|
||||||
|
},
|
||||||
|
cancelLinkage() {
|
||||||
|
this.cancelLinkageSettingStatus()
|
||||||
|
},
|
||||||
|
cancelLinkageSettingStatus() {
|
||||||
|
this.$store.commit('setLinkageSettingStatus', false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -228,10 +228,12 @@ export default {
|
|||||||
padding:0 8px;
|
padding:0 8px;
|
||||||
}
|
}
|
||||||
.father .child {
|
.father .child {
|
||||||
display: none;
|
/*display: none;*/
|
||||||
|
visibility: hidden;
|
||||||
}
|
}
|
||||||
.father:hover .child {
|
.father:hover .child {
|
||||||
display: inline;
|
/*display: inline;*/
|
||||||
|
visibility: visible;
|
||||||
}
|
}
|
||||||
.de-filter-tree {
|
.de-filter-tree {
|
||||||
>>>span.is-leaf {
|
>>>span.is-leaf {
|
||||||
|
@ -127,7 +127,7 @@ export default {
|
|||||||
tokenError: 'Token error, please login again',
|
tokenError: 'Token error, please login again',
|
||||||
username_error: 'Please enter the correct ID',
|
username_error: 'Please enter the correct ID',
|
||||||
password_error: 'The password can not be less than 8 digits',
|
password_error: 'The password can not be less than 8 digits',
|
||||||
login_again: 'Login again'
|
re_login: 'Login again'
|
||||||
},
|
},
|
||||||
commons: {
|
commons: {
|
||||||
no_target_permission: 'No permission',
|
no_target_permission: 'No permission',
|
||||||
@ -754,6 +754,7 @@ export default {
|
|||||||
chart_funnel: 'Funnel',
|
chart_funnel: 'Funnel',
|
||||||
chart_radar: 'Radar',
|
chart_radar: 'Radar',
|
||||||
chart_gauge: 'Gauge',
|
chart_gauge: 'Gauge',
|
||||||
|
chart_map: 'Map',
|
||||||
dateStyle: 'Date Style',
|
dateStyle: 'Date Style',
|
||||||
datePattern: 'Date Format',
|
datePattern: 'Date Format',
|
||||||
y: 'Year',
|
y: 'Year',
|
||||||
@ -822,6 +823,11 @@ export default {
|
|||||||
drag_block_funnel_split: 'Funnel Split',
|
drag_block_funnel_split: 'Funnel Split',
|
||||||
drag_block_radar_length: 'Branch Length',
|
drag_block_radar_length: 'Branch Length',
|
||||||
drag_block_radar_label: 'Branch Label',
|
drag_block_radar_label: 'Branch Label',
|
||||||
|
stack_item: 'Stack Item',
|
||||||
|
map_range: 'Map range',
|
||||||
|
select_map_range: 'Please select map range',
|
||||||
|
area: 'Area',
|
||||||
|
placeholder_field: 'Drag Field To Here',
|
||||||
axis_label_rotate: 'Label Rotate'
|
axis_label_rotate: 'Label Rotate'
|
||||||
},
|
},
|
||||||
dataset: {
|
dataset: {
|
||||||
@ -976,7 +982,19 @@ export default {
|
|||||||
right_join: 'RIGHT JOIN',
|
right_join: 'RIGHT JOIN',
|
||||||
inner_join: 'INNER JOIN',
|
inner_join: 'INNER JOIN',
|
||||||
full_join: 'FULL JOIN',
|
full_join: 'FULL JOIN',
|
||||||
can_not_union_diff_datasource: 'Union dataset must have same data source'
|
can_not_union_diff_datasource: 'Union dataset must have same data source',
|
||||||
|
operator: 'Operator',
|
||||||
|
d_q_trans: 'Dimension/Quota Transform',
|
||||||
|
add_calc_field: 'Create calc field',
|
||||||
|
input_name: 'Please input name',
|
||||||
|
field_exp: 'Field Expression',
|
||||||
|
data_type: 'Data Type',
|
||||||
|
click_ref_field: 'Click Quote Field',
|
||||||
|
click_ref_function: 'Click Quote Function',
|
||||||
|
field_manage: 'Field Manage',
|
||||||
|
edit_calc_field: 'Edit calc field',
|
||||||
|
calc_field: 'Calc Field',
|
||||||
|
show_sql: 'Show SQL'
|
||||||
},
|
},
|
||||||
datasource: {
|
datasource: {
|
||||||
datasource: 'Data Source',
|
datasource: 'Data Source',
|
||||||
@ -1290,5 +1308,54 @@ export default {
|
|||||||
i18n_msg_type_dataset_sync_faild: 'Dataset synchronization failed',
|
i18n_msg_type_dataset_sync_faild: 'Dataset synchronization failed',
|
||||||
i18n_msg_type_all: 'All type',
|
i18n_msg_type_all: 'All type',
|
||||||
channel_inner_msg: 'On site news'
|
channel_inner_msg: 'On site news'
|
||||||
|
},
|
||||||
|
denumberrange: {
|
||||||
|
label: 'Number range',
|
||||||
|
split_placeholder: 'To',
|
||||||
|
please_key_min: 'Please key min value',
|
||||||
|
please_key_max: 'Please key max value',
|
||||||
|
out_of_min: 'The min value cannot be less than the min integer -2³²',
|
||||||
|
out_of_max: 'The max value cannot be more than the max integer 2³²-1',
|
||||||
|
must_int: 'Please key interger',
|
||||||
|
min_out_max: 'The min value must be less than the max value',
|
||||||
|
max_out_min: 'The max value must be more than the min value'
|
||||||
|
},
|
||||||
|
denumberselect: {
|
||||||
|
label: 'Number selector',
|
||||||
|
placeholder: 'Please select'
|
||||||
|
},
|
||||||
|
deinputsearch: {
|
||||||
|
label: 'Text search',
|
||||||
|
placeholder: 'Please key keyword'
|
||||||
|
},
|
||||||
|
detextselect: {
|
||||||
|
label: 'Text selector',
|
||||||
|
placeholder: 'Please select'
|
||||||
|
},
|
||||||
|
detextgridselect: {
|
||||||
|
label: 'Text list',
|
||||||
|
placeholder: 'Please select'
|
||||||
|
},
|
||||||
|
denumbergridselect: {
|
||||||
|
label: 'Number list',
|
||||||
|
placeholder: 'Please select'
|
||||||
|
},
|
||||||
|
dedaterange: {
|
||||||
|
label: 'Date range',
|
||||||
|
to_placeholder: 'End date',
|
||||||
|
from_placeholder: 'Start date',
|
||||||
|
split_placeholder: 'To'
|
||||||
|
},
|
||||||
|
dedate: {
|
||||||
|
label: 'Date',
|
||||||
|
placeholder: 'Please select date'
|
||||||
|
},
|
||||||
|
deyearmonth: {
|
||||||
|
label: 'Month',
|
||||||
|
placeholder: 'Please select month'
|
||||||
|
},
|
||||||
|
deyear: {
|
||||||
|
label: 'Year',
|
||||||
|
placeholder: 'Please select year'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -109,25 +109,25 @@ export default {
|
|||||||
navbar: {
|
navbar: {
|
||||||
dashboard: '首頁',
|
dashboard: '首頁',
|
||||||
github: '項目地址',
|
github: '項目地址',
|
||||||
logOut: '退出登錄',
|
logOut: '退出登陸',
|
||||||
profile: '個人中心',
|
profile: '個人中心',
|
||||||
theme: '換膚',
|
theme: '換膚',
|
||||||
size: '佈局大小'
|
size: '佈局大小'
|
||||||
},
|
},
|
||||||
login: {
|
login: {
|
||||||
title: '系統登錄',
|
title: '系統登陸',
|
||||||
welcome: '歡迎使用',
|
welcome: '歡迎使用',
|
||||||
logIn: '登錄',
|
logIn: '登陸',
|
||||||
username: '帳號',
|
username: '帳號',
|
||||||
password: '密碼',
|
password: '密碼',
|
||||||
any: '任意字符',
|
any: '任意字符',
|
||||||
thirdparty: '第三方登錄',
|
thirdparty: '第三方登陸',
|
||||||
thirdpartyTips: '本地不能模擬,請結合自己業務進行模擬!!!',
|
thirdpartyTips: '本地不能模擬,請結合自己業務進行模擬!!!',
|
||||||
expires: '登錄信息過期,請重新登錄',
|
expires: '登陸信息過期,請重新登陸',
|
||||||
tokenError: '信息錯誤,請重新登錄',
|
tokenError: '信息錯誤,請重新登陸',
|
||||||
username_error: '請輸入正確的 ID',
|
username_error: '請輸入正確的 ID',
|
||||||
password_error: '密碼不小於 8 位',
|
password_error: '密碼不小於 8 位',
|
||||||
login_again: '重新登錄'
|
re_login: '重新登陸'
|
||||||
},
|
},
|
||||||
commons: {
|
commons: {
|
||||||
no_target_permission: '沒有權限',
|
no_target_permission: '沒有權限',
|
||||||
@ -184,7 +184,7 @@ export default {
|
|||||||
prompt: '提示',
|
prompt: '提示',
|
||||||
operating: '操作',
|
operating: '操作',
|
||||||
input_limit: '長度在 {0} 到 {1} 個字符',
|
input_limit: '長度在 {0} 到 {1} 個字符',
|
||||||
login: '登錄',
|
login: '登陸',
|
||||||
welcome: '一站式開源數據分析平臺',
|
welcome: '一站式開源數據分析平臺',
|
||||||
username: '姓名',
|
username: '姓名',
|
||||||
password: '密碼',
|
password: '密碼',
|
||||||
@ -256,7 +256,7 @@ export default {
|
|||||||
remove: '移除',
|
remove: '移除',
|
||||||
remove_cancel: '移除取消',
|
remove_cancel: '移除取消',
|
||||||
remove_success: '移除成功',
|
remove_success: '移除成功',
|
||||||
tips: '認證信息已過期,請重新登錄',
|
tips: '認證信息已過期,請重新登陸',
|
||||||
not_performed_yet: '尚未執行',
|
not_performed_yet: '尚未執行',
|
||||||
incorrect_input: '輸入內容不正確',
|
incorrect_input: '輸入內容不正確',
|
||||||
delete_confirm: '請輸入以下內容,確認刪除:',
|
delete_confirm: '請輸入以下內容,確認刪除:',
|
||||||
@ -754,6 +754,7 @@ export default {
|
|||||||
chart_funnel: '漏鬥圖',
|
chart_funnel: '漏鬥圖',
|
||||||
chart_radar: '雷達圖',
|
chart_radar: '雷達圖',
|
||||||
chart_gauge: '儀表盤',
|
chart_gauge: '儀表盤',
|
||||||
|
chart_map: '地圖',
|
||||||
dateStyle: '日期顯示',
|
dateStyle: '日期顯示',
|
||||||
datePattern: '日期格式',
|
datePattern: '日期格式',
|
||||||
y: '年',
|
y: '年',
|
||||||
@ -822,6 +823,11 @@ export default {
|
|||||||
drag_block_funnel_split: '漏鬥分層',
|
drag_block_funnel_split: '漏鬥分層',
|
||||||
drag_block_radar_length: '分支長度',
|
drag_block_radar_length: '分支長度',
|
||||||
drag_block_radar_label: '分支標簽',
|
drag_block_radar_label: '分支標簽',
|
||||||
|
map_range: '地圖範圍',
|
||||||
|
select_map_range: '請選擇地圖範圍',
|
||||||
|
area: '地區',
|
||||||
|
stack_item: '堆疊項',
|
||||||
|
placeholder_field: '拖動字段至此處',
|
||||||
axis_label_rotate: '標簽角度'
|
axis_label_rotate: '標簽角度'
|
||||||
},
|
},
|
||||||
dataset: {
|
dataset: {
|
||||||
@ -976,7 +982,19 @@ export default {
|
|||||||
right_join: '右連接',
|
right_join: '右連接',
|
||||||
inner_join: '內連接',
|
inner_join: '內連接',
|
||||||
full_join: '全連接',
|
full_join: '全連接',
|
||||||
can_not_union_diff_datasource: '被關聯數據集必須與當前數據集的數據源一致'
|
can_not_union_diff_datasource: '被關聯數據集必須與當前數據集的數據源一致',
|
||||||
|
operator: '操作',
|
||||||
|
d_q_trans: '維度/指標轉換',
|
||||||
|
add_calc_field: '新建计算字段',
|
||||||
|
input_name: '請輸入名稱',
|
||||||
|
field_exp: '字段表達式',
|
||||||
|
data_type: '數據類型',
|
||||||
|
click_ref_field: '點擊引用字段',
|
||||||
|
click_ref_function: '點擊引用函數',
|
||||||
|
field_manage: '字段管理',
|
||||||
|
edit_calc_field: '編輯計算字段',
|
||||||
|
calc_field: '計算字段',
|
||||||
|
show_sql: '顯示SQL'
|
||||||
},
|
},
|
||||||
datasource: {
|
datasource: {
|
||||||
datasource: '數據源',
|
datasource: '數據源',
|
||||||
@ -1129,7 +1147,7 @@ export default {
|
|||||||
lineHeight: '行高',
|
lineHeight: '行高',
|
||||||
letterSpacing: '字間距',
|
letterSpacing: '字間距',
|
||||||
textAlign: '左右對齊',
|
textAlign: '左右對齊',
|
||||||
opacity: '透明度',
|
opacity: '不透明度',
|
||||||
verticalAlign: '上下對齊',
|
verticalAlign: '上下對齊',
|
||||||
text_align_left: '左對齊',
|
text_align_left: '左對齊',
|
||||||
text_align_center: '左右居中',
|
text_align_center: '左右居中',
|
||||||
@ -1168,9 +1186,9 @@ export default {
|
|||||||
},
|
},
|
||||||
display: {
|
display: {
|
||||||
logo: '頭部系統 Logo',
|
logo: '頭部系統 Logo',
|
||||||
loginLogo: '登錄頁面頭部 Logo',
|
loginLogo: '登陸頁面頭部 Logo',
|
||||||
loginImage: '登錄頁面右側圖片',
|
loginImage: '登陸頁面右側圖片',
|
||||||
loginTitle: '登錄頁面標題',
|
loginTitle: '登陸頁面標題',
|
||||||
title: '系統名稱',
|
title: '系統名稱',
|
||||||
advice_size: '建議圖片大小'
|
advice_size: '建議圖片大小'
|
||||||
},
|
},
|
||||||
@ -1290,5 +1308,54 @@ export default {
|
|||||||
i18n_msg_type_dataset_sync_faild: '數據集同步失敗',
|
i18n_msg_type_dataset_sync_faild: '數據集同步失敗',
|
||||||
i18n_msg_type_all: '全部類型',
|
i18n_msg_type_all: '全部類型',
|
||||||
channel_inner_msg: '站內消息'
|
channel_inner_msg: '站內消息'
|
||||||
|
},
|
||||||
|
denumberrange: {
|
||||||
|
label: '數值區間',
|
||||||
|
split_placeholder: '至',
|
||||||
|
please_key_min: '請輸入最小值',
|
||||||
|
please_key_max: '請輸入最大值',
|
||||||
|
out_of_min: '最小值不能小于最小整數-2³²',
|
||||||
|
out_of_max: '最大值不能大于最大整數2³²-1',
|
||||||
|
must_int: '請輸入整數',
|
||||||
|
min_out_max: '最小值必須小于最大值',
|
||||||
|
max_out_min: '最大值必須大于最小值'
|
||||||
|
},
|
||||||
|
denumberselect: {
|
||||||
|
label: '數字下拉',
|
||||||
|
placeholder: '請選擇'
|
||||||
|
},
|
||||||
|
deinputsearch: {
|
||||||
|
label: '文本搜索',
|
||||||
|
placeholder: '請輸入關鍵字'
|
||||||
|
},
|
||||||
|
detextselect: {
|
||||||
|
label: '文本下拉',
|
||||||
|
placeholder: '請選擇'
|
||||||
|
},
|
||||||
|
detextgridselect: {
|
||||||
|
label: '文本列表',
|
||||||
|
placeholder: '請選擇'
|
||||||
|
},
|
||||||
|
denumbergridselect: {
|
||||||
|
label: '數字列表',
|
||||||
|
placeholder: '請選擇'
|
||||||
|
},
|
||||||
|
dedaterange: {
|
||||||
|
label: '日期範圍',
|
||||||
|
to_placeholder: '結束日期',
|
||||||
|
from_placeholder: '開始日期',
|
||||||
|
split_placeholder: '至'
|
||||||
|
},
|
||||||
|
dedate: {
|
||||||
|
label: '日期',
|
||||||
|
placeholder: '請選擇日期'
|
||||||
|
},
|
||||||
|
deyearmonth: {
|
||||||
|
label: '年月',
|
||||||
|
placeholder: '請選擇年月'
|
||||||
|
},
|
||||||
|
deyear: {
|
||||||
|
label: '年份',
|
||||||
|
placeholder: '請選擇年份'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -127,7 +127,7 @@ export default {
|
|||||||
tokenError: '登陆信息错误,请重新登录',
|
tokenError: '登陆信息错误,请重新登录',
|
||||||
username_error: '请输入正确的 ID',
|
username_error: '请输入正确的 ID',
|
||||||
password_error: '密码不小于 8 位',
|
password_error: '密码不小于 8 位',
|
||||||
login_again: '重新登录'
|
re_login: '重新登录'
|
||||||
},
|
},
|
||||||
commons: {
|
commons: {
|
||||||
no_target_permission: '没有权限',
|
no_target_permission: '没有权限',
|
||||||
@ -754,6 +754,7 @@ export default {
|
|||||||
chart_funnel: '漏斗图',
|
chart_funnel: '漏斗图',
|
||||||
chart_radar: '雷达图',
|
chart_radar: '雷达图',
|
||||||
chart_gauge: '仪表盘',
|
chart_gauge: '仪表盘',
|
||||||
|
chart_map: '地图',
|
||||||
dateStyle: '日期显示',
|
dateStyle: '日期显示',
|
||||||
datePattern: '日期格式',
|
datePattern: '日期格式',
|
||||||
y: '年',
|
y: '年',
|
||||||
@ -822,6 +823,11 @@ export default {
|
|||||||
drag_block_funnel_split: '漏斗分层',
|
drag_block_funnel_split: '漏斗分层',
|
||||||
drag_block_radar_length: '分支长度',
|
drag_block_radar_length: '分支长度',
|
||||||
drag_block_radar_label: '分支标签',
|
drag_block_radar_label: '分支标签',
|
||||||
|
map_range: '地图范围',
|
||||||
|
select_map_range: '请选择地图范围',
|
||||||
|
area: '地区',
|
||||||
|
stack_item: '堆叠项',
|
||||||
|
placeholder_field: '拖动字段至此处',
|
||||||
axis_label_rotate: '标签角度'
|
axis_label_rotate: '标签角度'
|
||||||
},
|
},
|
||||||
dataset: {
|
dataset: {
|
||||||
@ -976,7 +982,19 @@ export default {
|
|||||||
right_join: '右连接',
|
right_join: '右连接',
|
||||||
inner_join: '内连接',
|
inner_join: '内连接',
|
||||||
full_join: '全连接',
|
full_join: '全连接',
|
||||||
can_not_union_diff_datasource: '被关联数据集必须与当前数据集的数据源一致'
|
can_not_union_diff_datasource: '被关联数据集必须与当前数据集的数据源一致',
|
||||||
|
operator: '操作',
|
||||||
|
d_q_trans: '维度/指标转换',
|
||||||
|
add_calc_field: '新建计算字段',
|
||||||
|
input_name: '请输入名称',
|
||||||
|
field_exp: '字段表达式',
|
||||||
|
data_type: '数据类型',
|
||||||
|
click_ref_field: '点击引用字段',
|
||||||
|
click_ref_function: '点击引用函数',
|
||||||
|
field_manage: '字段管理',
|
||||||
|
edit_calc_field: '编辑计算字段',
|
||||||
|
calc_field: '计算字段',
|
||||||
|
show_sql: '显示SQL'
|
||||||
},
|
},
|
||||||
datasource: {
|
datasource: {
|
||||||
datasource: '数据源',
|
datasource: '数据源',
|
||||||
@ -1131,7 +1149,7 @@ export default {
|
|||||||
lineHeight: '行高',
|
lineHeight: '行高',
|
||||||
letterSpacing: '字间距',
|
letterSpacing: '字间距',
|
||||||
textAlign: '左右对齐',
|
textAlign: '左右对齐',
|
||||||
opacity: '透明度',
|
opacity: '不透明度',
|
||||||
verticalAlign: '上下对齐',
|
verticalAlign: '上下对齐',
|
||||||
text_align_left: '左对齐',
|
text_align_left: '左对齐',
|
||||||
text_align_center: '左右居中',
|
text_align_center: '左右居中',
|
||||||
@ -1293,5 +1311,54 @@ export default {
|
|||||||
i18n_msg_type_dataset_sync_faild: '数据集同步失败',
|
i18n_msg_type_dataset_sync_faild: '数据集同步失败',
|
||||||
i18n_msg_type_all: '全部类型',
|
i18n_msg_type_all: '全部类型',
|
||||||
channel_inner_msg: '站内消息'
|
channel_inner_msg: '站内消息'
|
||||||
|
},
|
||||||
|
denumberrange: {
|
||||||
|
label: '数值区间',
|
||||||
|
split_placeholder: '至',
|
||||||
|
please_key_min: '请输入最小值',
|
||||||
|
please_key_max: '请输入最大值',
|
||||||
|
out_of_min: '最小值不能小于最小整数-2³²',
|
||||||
|
out_of_max: '最大值不能大于最大整数2³²-1',
|
||||||
|
must_int: '请输入整数',
|
||||||
|
min_out_max: '最小值必须小于最大值',
|
||||||
|
max_out_min: '最大值必须大于最小值'
|
||||||
|
},
|
||||||
|
denumberselect: {
|
||||||
|
label: '数字下拉',
|
||||||
|
placeholder: '请选择'
|
||||||
|
},
|
||||||
|
deinputsearch: {
|
||||||
|
label: '文本搜索',
|
||||||
|
placeholder: '请输入关键字'
|
||||||
|
},
|
||||||
|
detextselect: {
|
||||||
|
label: '文本下拉',
|
||||||
|
placeholder: '请选择'
|
||||||
|
},
|
||||||
|
detextgridselect: {
|
||||||
|
label: '文本列表',
|
||||||
|
placeholder: '请选择'
|
||||||
|
},
|
||||||
|
denumbergridselect: {
|
||||||
|
label: '数字列表',
|
||||||
|
placeholder: '请选择'
|
||||||
|
},
|
||||||
|
dedaterange: {
|
||||||
|
label: '日期范围',
|
||||||
|
to_placeholder: '结束日期',
|
||||||
|
from_placeholder: '开始日期',
|
||||||
|
split_placeholder: '至'
|
||||||
|
},
|
||||||
|
dedate: {
|
||||||
|
label: '日期',
|
||||||
|
placeholder: '请选择日期'
|
||||||
|
},
|
||||||
|
deyearmonth: {
|
||||||
|
label: '年月',
|
||||||
|
placeholder: '请选择年月'
|
||||||
|
},
|
||||||
|
deyear: {
|
||||||
|
label: '年份',
|
||||||
|
placeholder: '请选择年份'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -16,7 +16,7 @@ const LinkTokenKey = Config.LinkTokenKey
|
|||||||
const service = axios.create({
|
const service = axios.create({
|
||||||
baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
|
baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
|
||||||
// withCredentials: true, // send cookies when cross-domain requests
|
// withCredentials: true, // send cookies when cross-domain requests
|
||||||
timeout: 20000 // request timeout
|
timeout: 10000 // request timeout
|
||||||
})
|
})
|
||||||
|
|
||||||
// request interceptor
|
// request interceptor
|
||||||
@ -52,6 +52,10 @@ service.interceptors.request.use(
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// const defaultOptions = {
|
||||||
|
// confirmButtonText: i18n.t('login.re_login')
|
||||||
|
// }
|
||||||
|
|
||||||
const checkAuth = response => {
|
const checkAuth = response => {
|
||||||
// 请根据实际需求修改
|
// 请根据实际需求修改
|
||||||
|
|
||||||
@ -63,7 +67,7 @@ const checkAuth = response => {
|
|||||||
location.reload()
|
location.reload()
|
||||||
})
|
})
|
||||||
}, {
|
}, {
|
||||||
confirmButtonText: i18n.t('login.login_again'),
|
confirmButtonText: i18n.t('login.re_login'),
|
||||||
showClose: false
|
showClose: false
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -75,7 +79,7 @@ const checkAuth = response => {
|
|||||||
location.reload()
|
location.reload()
|
||||||
})
|
})
|
||||||
}, {
|
}, {
|
||||||
confirmButtonText: i18n.t('login.login_again'),
|
confirmButtonText: i18n.t('login.re_login'),
|
||||||
showClose: false
|
showClose: false
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -113,13 +113,16 @@ export default {
|
|||||||
}
|
}
|
||||||
|
|
||||||
geoJson(customAttr.areaCode).then(res => {
|
geoJson(customAttr.areaCode).then(res => {
|
||||||
this.initMapChart(res.data, chart)
|
// this.initMapChart(res.data, chart)
|
||||||
|
this.initMapChart(res, chart)
|
||||||
|
|
||||||
this.$store.dispatch('map/setGeo', {
|
this.$store.dispatch('map/setGeo', {
|
||||||
key: customAttr.areaCode,
|
key: customAttr.areaCode,
|
||||||
value: res.data
|
value: res
|
||||||
|
// value: res.data
|
||||||
})
|
})
|
||||||
this.currentGeoJson = res.data
|
// this.currentGeoJson = res.data
|
||||||
|
this.currentGeoJson = res
|
||||||
})
|
})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -257,13 +257,13 @@
|
|||||||
|
|
||||||
<!--添加视图-选择数据集-->
|
<!--添加视图-选择数据集-->
|
||||||
<el-dialog
|
<el-dialog
|
||||||
|
v-if="selectTableFlag"
|
||||||
v-dialogDrag
|
v-dialogDrag
|
||||||
:title="$t('chart.add_chart')"
|
:title="$t('chart.add_chart')"
|
||||||
:visible="selectTableFlag"
|
:visible="selectTableFlag"
|
||||||
:show-close="false"
|
:show-close="false"
|
||||||
width="70%"
|
width="70%"
|
||||||
class="dialog-css"
|
class="dialog-css"
|
||||||
:destroy-on-close="true"
|
|
||||||
>
|
>
|
||||||
<el-row style="width: 800px;">
|
<el-row style="width: 800px;">
|
||||||
<el-form ref="form" :model="table" label-width="80px" size="mini" class="form-item">
|
<el-form ref="form" :model="table" label-width="80px" size="mini" class="form-item">
|
||||||
@ -1048,10 +1048,12 @@ export default {
|
|||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
}
|
}
|
||||||
.father .child {
|
.father .child {
|
||||||
display: none;
|
/*display: none;*/
|
||||||
|
visibility: hidden;
|
||||||
}
|
}
|
||||||
.father:hover .child {
|
.father:hover .child {
|
||||||
display: inline;
|
/*display: inline;*/
|
||||||
|
visibility: visible;
|
||||||
}
|
}
|
||||||
.tree-style {
|
.tree-style {
|
||||||
padding: 10px 15px;
|
padding: 10px 15px;
|
||||||
|
@ -489,13 +489,13 @@
|
|||||||
|
|
||||||
<!--视图更换数据集-->
|
<!--视图更换数据集-->
|
||||||
<el-dialog
|
<el-dialog
|
||||||
|
v-if="selectTableFlag"
|
||||||
v-dialogDrag
|
v-dialogDrag
|
||||||
:title="changeDsTitle"
|
:title="changeDsTitle"
|
||||||
:visible="selectTableFlag"
|
:visible="selectTableFlag"
|
||||||
:show-close="false"
|
:show-close="false"
|
||||||
width="70%"
|
width="70%"
|
||||||
class="dialog-css"
|
class="dialog-css"
|
||||||
:destroy-on-close="true"
|
|
||||||
>
|
>
|
||||||
<table-selector @getTable="getTable" />
|
<table-selector @getTable="getTable" />
|
||||||
<p style="margin-top: 10px;color:#F56C6C;font-size: 12px;">{{ $t('chart.change_ds_tip') }}</p>
|
<p style="margin-top: 10px;color:#F56C6C;font-size: 12px;">{{ $t('chart.change_ds_tip') }}</p>
|
||||||
@ -507,10 +507,10 @@
|
|||||||
|
|
||||||
<!--编辑视图使用的数据集的字段-->
|
<!--编辑视图使用的数据集的字段-->
|
||||||
<el-dialog
|
<el-dialog
|
||||||
|
v-if="editDsField"
|
||||||
:visible="editDsField"
|
:visible="editDsField"
|
||||||
:show-close="false"
|
:show-close="false"
|
||||||
class="dialog-css"
|
class="dialog-css"
|
||||||
:destroy-on-close="true"
|
|
||||||
:fullscreen="true"
|
:fullscreen="true"
|
||||||
>
|
>
|
||||||
<field-edit :param="table" />
|
<field-edit :param="table" />
|
||||||
@ -1352,7 +1352,7 @@ export default {
|
|||||||
return resultNode
|
return resultNode
|
||||||
},
|
},
|
||||||
addStack(e) {
|
addStack(e) {
|
||||||
this.dragCheckType(this.dimensionData, 'd')
|
this.dragCheckType(this.view.extStack, 'd')
|
||||||
if (this.view.extStack && this.view.extStack.length > 1) {
|
if (this.view.extStack && this.view.extStack.length > 1) {
|
||||||
this.view.extStack = [this.view.extStack[0]]
|
this.view.extStack = [this.view.extStack[0]]
|
||||||
}
|
}
|
||||||
|
@ -68,7 +68,6 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { isKettleRunning, post } from '@/api/dataset/dataset'
|
import { isKettleRunning, post } from '@/api/dataset/dataset'
|
||||||
import { authModel } from '@/api/system/sysAuth'
|
|
||||||
import { hasDataPermission } from '@/utils/permission'
|
import { hasDataPermission } from '@/utils/permission'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@ -403,11 +402,14 @@ export default {
|
|||||||
|
|
||||||
searchTree(val) {
|
searchTree(val) {
|
||||||
const queryCondition = {
|
const queryCondition = {
|
||||||
withExtend: 'parent',
|
// withExtend: 'parent',
|
||||||
modelType: 'dataset',
|
// modelType: 'dataset',
|
||||||
name: val
|
name: val
|
||||||
}
|
}
|
||||||
authModel(queryCondition).then(res => {
|
// authModel(queryCondition).then(res => {
|
||||||
|
// this.data = this.buildTree(res.data)
|
||||||
|
// })
|
||||||
|
post('/dataset/table/search', queryCondition).then(res => {
|
||||||
this.data = this.buildTree(res.data)
|
this.data = this.buildTree(res.data)
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
@ -420,8 +422,8 @@ export default {
|
|||||||
const roots = []
|
const roots = []
|
||||||
arrs.forEach(el => {
|
arrs.forEach(el => {
|
||||||
// 判断根节点 ###
|
// 判断根节点 ###
|
||||||
el.type = el.modelInnerType
|
// el.type = el.modelInnerType
|
||||||
el.isLeaf = el.leaf
|
// el.isLeaf = el.leaf
|
||||||
if (el[this.treeProps.parentId] === null || el[this.treeProps.parentId] === 0 || el[this.treeProps.parentId] === '0') {
|
if (el[this.treeProps.parentId] === null || el[this.treeProps.parentId] === 0 || el[this.treeProps.parentId] === '0') {
|
||||||
roots.push(el)
|
roots.push(el)
|
||||||
return
|
return
|
||||||
|
@ -315,6 +315,8 @@ export default {
|
|||||||
if (!this.fieldForm.id) {
|
if (!this.fieldForm.id) {
|
||||||
this.fieldForm.type = this.fieldForm.deType
|
this.fieldForm.type = this.fieldForm.deType
|
||||||
this.fieldForm.deExtractType = this.fieldForm.deType
|
this.fieldForm.deExtractType = this.fieldForm.deType
|
||||||
|
this.fieldForm.tableId = this.param.id
|
||||||
|
this.fieldForm.columnIndex = this.tableFields.dimensionList.length + this.tableFields.quotaList.length
|
||||||
}
|
}
|
||||||
post('/dataset/field/save', this.fieldForm).then(response => {
|
post('/dataset/field/save', this.fieldForm).then(response => {
|
||||||
this.closeCalcField()
|
this.closeCalcField()
|
||||||
@ -371,7 +373,8 @@ export default {
|
|||||||
padding: 0 4px;
|
padding: 0 4px;
|
||||||
}
|
}
|
||||||
.field-height{
|
.field-height{
|
||||||
height: calc(50% - 20px);
|
height: calc(50% - 25px);
|
||||||
|
margin-top: 4px;
|
||||||
}
|
}
|
||||||
.drag-list {
|
.drag-list {
|
||||||
height: calc(100% - 26px);
|
height: calc(100% - 26px);
|
||||||
@ -442,8 +445,9 @@ export default {
|
|||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
}
|
}
|
||||||
.function-height{
|
.function-height{
|
||||||
height: calc(100% - 20px);
|
height: calc(100% - 50px);
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
|
margin-top: 4px;
|
||||||
}
|
}
|
||||||
.function-pop>>>.el-popover{
|
.function-pop>>>.el-popover{
|
||||||
padding: 6px!important;
|
padding: 6px!important;
|
||||||
|
@ -432,10 +432,14 @@ export default {
|
|||||||
created() {
|
created() {
|
||||||
this.timer = setInterval(() => {
|
this.timer = setInterval(() => {
|
||||||
this.listTaskLog(false)
|
this.listTaskLog(false)
|
||||||
|
}, 5000);
|
||||||
|
this.taskTimer = setInterval(() => {
|
||||||
|
this.listTask(false)
|
||||||
}, 5000)
|
}, 5000)
|
||||||
},
|
},
|
||||||
beforeDestroy() {
|
beforeDestroy() {
|
||||||
clearInterval(this.timer)
|
clearInterval(this.timer)
|
||||||
|
clearInterval(this.taskTimer)
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
calHeight() {
|
calHeight() {
|
||||||
|
@ -989,10 +989,12 @@ export default {
|
|||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
}
|
}
|
||||||
.father .child {
|
.father .child {
|
||||||
display: none;
|
/*display: none;*/
|
||||||
|
visibility: hidden;
|
||||||
}
|
}
|
||||||
.father:hover .child {
|
.father:hover .child {
|
||||||
display: inline;
|
/*display: inline;*/
|
||||||
|
visibility: visible;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dialog-css >>> .el-dialog__body {
|
.dialog-css >>> .el-dialog__body {
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
<de-container>
|
<de-container>
|
||||||
<!--左侧导航栏-->
|
<!--左侧导航栏-->
|
||||||
<de-aside-container class="ms-aside-container">
|
<de-aside-container class="ms-aside-container">
|
||||||
<div style="width: 60px; left: 0px; top: 0px; bottom: 0px; position: absolute">
|
<div v-if="!linkageSettingStatus" style="width: 60px; left: 0px; top: 0px; bottom: 0px; position: absolute">
|
||||||
<div style="width: 60px;height: 100%;overflow: hidden auto;position: relative;margin: 0px auto; font-size: 14px">
|
<div style="width: 60px;height: 100%;overflow: hidden auto;position: relative;margin: 0px auto; font-size: 14px">
|
||||||
<!-- 视图图表 start -->
|
<!-- 视图图表 start -->
|
||||||
<div class="button-div-class" style=" width: 24px;height: 24px;text-align: center;line-height: 1;position: relative;margin: 16px auto 0px;">
|
<div class="button-div-class" style=" width: 24px;height: 24px;text-align: center;line-height: 1;position: relative;margin: 16px auto 0px;">
|
||||||
@ -290,7 +290,8 @@ export default {
|
|||||||
'isClickComponent',
|
'isClickComponent',
|
||||||
'canvasStyleData',
|
'canvasStyleData',
|
||||||
'curComponentIndex',
|
'curComponentIndex',
|
||||||
'componentData'
|
'componentData',
|
||||||
|
'linkageSettingStatus'
|
||||||
])
|
])
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -322,6 +323,7 @@ export default {
|
|||||||
listenGlobalKeyDown()
|
listenGlobalKeyDown()
|
||||||
|
|
||||||
this.$store.commit('setCurComponent', { component: null, index: null })
|
this.$store.commit('setCurComponent', { component: null, index: null })
|
||||||
|
this.$store.commit('setLinkageSettingStatus', false)
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
// this.insertToBody()
|
// this.insertToBody()
|
||||||
|
@ -647,10 +647,12 @@ export default {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.father .child {
|
.father .child {
|
||||||
display: none;
|
/*display: none;*/
|
||||||
|
visibility: hidden;
|
||||||
}
|
}
|
||||||
.father:hover .child {
|
.father:hover .child {
|
||||||
display: inline;
|
/*display: inline;*/
|
||||||
|
visibility: visible;
|
||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
@ -298,10 +298,12 @@ export default {
|
|||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
}
|
}
|
||||||
.father .child {
|
.father .child {
|
||||||
display: none;
|
/*display: none;*/
|
||||||
|
visibility: hidden;
|
||||||
}
|
}
|
||||||
.father:hover .child {
|
.father:hover .child {
|
||||||
display: inline;
|
/*display: inline;*/
|
||||||
|
visibility: visible;
|
||||||
}
|
}
|
||||||
.tree-style {
|
.tree-style {
|
||||||
padding: 10px 15px;
|
padding: 10px 15px;
|
||||||
|
@ -416,15 +416,21 @@ export default {
|
|||||||
this.update_task = true
|
this.update_task = true
|
||||||
},
|
},
|
||||||
changeTaskStatus(task) {
|
changeTaskStatus(task) {
|
||||||
const param = task
|
let param = JSON.parse(JSON.stringify(task));
|
||||||
param.status = task.status === 'Underway' ? 'Pending' : 'Underway'
|
param.status = task.status === 'Underway' ? 'Pending' : 'Underway'
|
||||||
post('/dataset/task/updateStatus', task).then(response => {
|
post('/dataset/task/updateStatus', param).then(response => {
|
||||||
task.status = param.status
|
if(response.success){
|
||||||
this.$message({
|
task.status = param.status
|
||||||
message: this.$t('dataset.task.change_success'),
|
this.$message({
|
||||||
type: 'success',
|
message: this.$t('dataset.task.change_success'),
|
||||||
showClose: true
|
type: 'success',
|
||||||
})
|
showClose: true
|
||||||
|
})
|
||||||
|
}else {
|
||||||
|
this.search(this.last_condition, false)
|
||||||
|
}
|
||||||
|
}).catch(() => {
|
||||||
|
this.search(this.last_condition, false)
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
execTask(task) {
|
execTask(task) {
|
||||||
|
@ -140,8 +140,8 @@ export default {
|
|||||||
createTimer() {
|
createTimer() {
|
||||||
if (!this.timer) {
|
if (!this.timer) {
|
||||||
this.timer = setInterval(() => {
|
this.timer = setInterval(() => {
|
||||||
this.search(this.last_condition, false)
|
this.timerSearch(this.last_condition, false)
|
||||||
}, 1000)
|
}, 15000)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
destroyTimer() {
|
destroyTimer() {
|
||||||
@ -168,7 +168,7 @@ export default {
|
|||||||
},
|
},
|
||||||
select(selection) {
|
select(selection) {
|
||||||
},
|
},
|
||||||
search(condition, showLoading = true) {
|
timerSearch(condition, showLoading = true) {
|
||||||
if(!this.lastRequestComplete){
|
if(!this.lastRequestComplete){
|
||||||
return;
|
return;
|
||||||
}else {
|
}else {
|
||||||
@ -188,6 +188,17 @@ export default {
|
|||||||
this.lastRequestComplete = true;
|
this.lastRequestComplete = true;
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
search(condition, showLoading = true) {
|
||||||
|
this.last_condition = condition
|
||||||
|
condition = formatQuickCondition(condition, 'dataset_table_task.name')
|
||||||
|
const temp = formatCondition(condition)
|
||||||
|
const param = temp || {}
|
||||||
|
param['orders'] = formatOrders(this.orderConditions)
|
||||||
|
post('/dataset/taskLog/list/notexcel/' + this.paginationConfig.currentPage + '/' + this.paginationConfig.pageSize, param, showLoading).then(response => {
|
||||||
|
this.data = response.data.listObject
|
||||||
|
this.paginationConfig.total = response.data.itemCount
|
||||||
|
})
|
||||||
|
},
|
||||||
showErrorMassage(massage) {
|
showErrorMassage(massage) {
|
||||||
this.show_error_massage = true
|
this.show_error_massage = true
|
||||||
this.error_massage = massage
|
this.error_massage = massage
|
||||||
|
Loading…
Reference in New Issue
Block a user