diff --git a/backend/src/main/java/io/dataease/auth/config/ShiroConfig.java b/backend/src/main/java/io/dataease/auth/config/ShiroConfig.java index 8e32c44079..a3d6e190de 100644 --- a/backend/src/main/java/io/dataease/auth/config/ShiroConfig.java +++ b/backend/src/main/java/io/dataease/auth/config/ShiroConfig.java @@ -50,6 +50,7 @@ public class ShiroConfig { filterMap.put("f2cPerms", new F2CPermissionsFilter()); filterMap.put("jwt", new JWTFilter()); filterMap.put("logout", new F2CLogoutFilter()); + filterMap.put("link", new F2CLinkFilter()); factoryBean.setSecurityManager(securityManager); factoryBean.setLoginUrl("/login"); factoryBean.setUnauthorizedUrl("/login"); diff --git a/backend/src/main/java/io/dataease/auth/filter/F2CLinkFilter.java b/backend/src/main/java/io/dataease/auth/filter/F2CLinkFilter.java new file mode 100644 index 0000000000..8cca8edbf7 --- /dev/null +++ b/backend/src/main/java/io/dataease/auth/filter/F2CLinkFilter.java @@ -0,0 +1,51 @@ +package io.dataease.auth.filter; + +import cn.hutool.core.util.ObjectUtil; +import com.auth0.jwt.JWT; +import com.auth0.jwt.interfaces.Claim; +import com.auth0.jwt.interfaces.DecodedJWT; +import io.dataease.auth.config.RsaProperties; +import io.dataease.auth.util.JWTUtils; +import io.dataease.auth.util.LinkUtil; +import io.dataease.auth.util.RsaUtil; +import io.dataease.base.domain.PanelLink; +import io.dataease.commons.utils.LogUtil; +import org.apache.commons.lang3.StringUtils; +import org.apache.shiro.web.filter.authc.AnonymousFilter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; + +public class F2CLinkFilter extends AnonymousFilter { + + private static final Logger logger = LoggerFactory.getLogger(F2CLogoutFilter.class); + + private static final String LINK_TOKEN_KEY = "LINK-PWD-TOKEN"; + + @Override + protected boolean onPreHandle(ServletRequest request, ServletResponse response, Object mappedValue) { + try{ + HttpServletRequest req = (HttpServletRequest) request; + String link_token = req.getHeader(LINK_TOKEN_KEY); + DecodedJWT jwt = JWT.decode(link_token); + Claim resourceId = jwt.getClaim("resourceId"); + String id = resourceId.asString(); + PanelLink panelLink = LinkUtil.queryLink(id); + if (ObjectUtil.isEmpty(panelLink)) return false; + if (!panelLink.getEnablePwd()) { + panelLink.setPwd("dataease"); + } + return JWTUtils.verifyLink(link_token, id, RsaUtil.decryptByPrivateKey(RsaProperties.privateKey, panelLink.getPwd())); + }catch (Exception e) { + LogUtil.error(e); + } + return false; + + } + + + + +} diff --git a/backend/src/main/java/io/dataease/auth/service/impl/ShiroServiceImpl.java b/backend/src/main/java/io/dataease/auth/service/impl/ShiroServiceImpl.java index 954a6f7266..0298899473 100644 --- a/backend/src/main/java/io/dataease/auth/service/impl/ShiroServiceImpl.java +++ b/backend/src/main/java/io/dataease/auth/service/impl/ShiroServiceImpl.java @@ -41,8 +41,7 @@ public class ShiroServiceImpl implements ShiroService { //验证链接 filterChainDefinitionMap.put("/api/link/validate**", ANON); - filterChainDefinitionMap.put("/panel/group/findOne/**", ANON); - filterChainDefinitionMap.put("/chart/view/getData/**", ANON); + filterChainDefinitionMap.put("/system/ui/**", ANON); @@ -59,9 +58,16 @@ public class ShiroServiceImpl implements ShiroService { filterChainDefinitionMap.put("/tokenExpired", ANON); filterChainDefinitionMap.put("/downline", ANON); filterChainDefinitionMap.put("/common-files/**", ANON); + filterChainDefinitionMap.put("/api/auth/logout", "logout"); + + filterChainDefinitionMap.put("/api/link/resourceDetail/**", "link"); + filterChainDefinitionMap.put("/api/link/viewDetail/**", "link"); + filterChainDefinitionMap.put("/**", "authc"); + filterChainDefinitionMap.put("/**", "jwt"); + return filterChainDefinitionMap; } diff --git a/backend/src/main/java/io/dataease/auth/util/LinkUtil.java b/backend/src/main/java/io/dataease/auth/util/LinkUtil.java new file mode 100644 index 0000000000..df29abc08a --- /dev/null +++ b/backend/src/main/java/io/dataease/auth/util/LinkUtil.java @@ -0,0 +1,22 @@ +package io.dataease.auth.util; + +import io.dataease.base.domain.PanelLink; +import io.dataease.service.panel.PanelLinkService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class LinkUtil { + + + private static PanelLinkService panelLinkService; + + @Autowired + public void setPanelLinkService(PanelLinkService panelLinkService) { + LinkUtil.panelLinkService = panelLinkService; + } + + public static PanelLink queryLink(String resourceId) { + return panelLinkService.findOne(resourceId); + } +} diff --git a/backend/src/main/java/io/dataease/base/domain/DatasetTableFunction.java b/backend/src/main/java/io/dataease/base/domain/DatasetTableFunction.java new file mode 100644 index 0000000000..b6232a6fa0 --- /dev/null +++ b/backend/src/main/java/io/dataease/base/domain/DatasetTableFunction.java @@ -0,0 +1,21 @@ +package io.dataease.base.domain; + +import java.io.Serializable; +import lombok.Data; + +@Data +public class DatasetTableFunction implements Serializable { + private Long id; + + private String name; + + private String func; + + private String dbType; + + private Integer funcType; + + private String desc; + + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/backend/src/main/java/io/dataease/base/domain/DatasetTableFunctionExample.java b/backend/src/main/java/io/dataease/base/domain/DatasetTableFunctionExample.java new file mode 100644 index 0000000000..f098e791f9 --- /dev/null +++ b/backend/src/main/java/io/dataease/base/domain/DatasetTableFunctionExample.java @@ -0,0 +1,530 @@ +package io.dataease.base.domain; + +import java.util.ArrayList; +import java.util.List; + +public class DatasetTableFunctionExample { + protected String orderByClause; + + protected boolean distinct; + + protected List oredCriteria; + + public DatasetTableFunctionExample() { + oredCriteria = new ArrayList(); + } + + public void setOrderByClause(String orderByClause) { + this.orderByClause = orderByClause; + } + + public String getOrderByClause() { + return orderByClause; + } + + public void setDistinct(boolean distinct) { + this.distinct = distinct; + } + + public boolean isDistinct() { + return distinct; + } + + public List getOredCriteria() { + return oredCriteria; + } + + public void or(Criteria criteria) { + oredCriteria.add(criteria); + } + + public Criteria or() { + Criteria criteria = createCriteriaInternal(); + oredCriteria.add(criteria); + return criteria; + } + + public Criteria createCriteria() { + Criteria criteria = createCriteriaInternal(); + if (oredCriteria.size() == 0) { + oredCriteria.add(criteria); + } + return criteria; + } + + protected Criteria createCriteriaInternal() { + Criteria criteria = new Criteria(); + return criteria; + } + + public void clear() { + oredCriteria.clear(); + orderByClause = null; + distinct = false; + } + + protected abstract static class GeneratedCriteria { + protected List criteria; + + protected GeneratedCriteria() { + super(); + criteria = new ArrayList(); + } + + public boolean isValid() { + return criteria.size() > 0; + } + + public List getAllCriteria() { + return criteria; + } + + public List getCriteria() { + return criteria; + } + + protected void addCriterion(String condition) { + if (condition == null) { + throw new RuntimeException("Value for condition cannot be null"); + } + criteria.add(new Criterion(condition)); + } + + protected void addCriterion(String condition, Object value, String property) { + if (value == null) { + throw new RuntimeException("Value for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value)); + } + + protected void addCriterion(String condition, Object value1, Object value2, String property) { + if (value1 == null || value2 == null) { + throw new RuntimeException("Between values for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value1, value2)); + } + + public Criteria andIdIsNull() { + addCriterion("id is null"); + return (Criteria) this; + } + + public Criteria andIdIsNotNull() { + addCriterion("id is not null"); + return (Criteria) this; + } + + public Criteria andIdEqualTo(Long value) { + addCriterion("id =", value, "id"); + return (Criteria) this; + } + + public Criteria andIdNotEqualTo(Long value) { + addCriterion("id <>", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThan(Long value) { + addCriterion("id >", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThanOrEqualTo(Long value) { + addCriterion("id >=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThan(Long value) { + addCriterion("id <", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThanOrEqualTo(Long value) { + addCriterion("id <=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdIn(List values) { + addCriterion("id in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdNotIn(List values) { + addCriterion("id not in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdBetween(Long value1, Long value2) { + addCriterion("id between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andIdNotBetween(Long value1, Long value2) { + addCriterion("id not between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andNameIsNull() { + addCriterion("`name` is null"); + return (Criteria) this; + } + + public Criteria andNameIsNotNull() { + addCriterion("`name` is not null"); + return (Criteria) this; + } + + public Criteria andNameEqualTo(String value) { + addCriterion("`name` =", value, "name"); + return (Criteria) this; + } + + public Criteria andNameNotEqualTo(String value) { + addCriterion("`name` <>", value, "name"); + return (Criteria) this; + } + + public Criteria andNameGreaterThan(String value) { + addCriterion("`name` >", value, "name"); + return (Criteria) this; + } + + public Criteria andNameGreaterThanOrEqualTo(String value) { + addCriterion("`name` >=", value, "name"); + return (Criteria) this; + } + + public Criteria andNameLessThan(String value) { + addCriterion("`name` <", value, "name"); + return (Criteria) this; + } + + public Criteria andNameLessThanOrEqualTo(String value) { + addCriterion("`name` <=", value, "name"); + return (Criteria) this; + } + + public Criteria andNameLike(String value) { + addCriterion("`name` like", value, "name"); + return (Criteria) this; + } + + public Criteria andNameNotLike(String value) { + addCriterion("`name` not like", value, "name"); + return (Criteria) this; + } + + public Criteria andNameIn(List values) { + addCriterion("`name` in", values, "name"); + return (Criteria) this; + } + + public Criteria andNameNotIn(List values) { + addCriterion("`name` not in", values, "name"); + return (Criteria) this; + } + + public Criteria andNameBetween(String value1, String value2) { + addCriterion("`name` between", value1, value2, "name"); + return (Criteria) this; + } + + public Criteria andNameNotBetween(String value1, String value2) { + addCriterion("`name` not between", value1, value2, "name"); + return (Criteria) this; + } + + public Criteria andFuncIsNull() { + addCriterion("func is null"); + return (Criteria) this; + } + + public Criteria andFuncIsNotNull() { + addCriterion("func is not null"); + return (Criteria) this; + } + + public Criteria andFuncEqualTo(String value) { + addCriterion("func =", value, "func"); + return (Criteria) this; + } + + public Criteria andFuncNotEqualTo(String value) { + addCriterion("func <>", value, "func"); + return (Criteria) this; + } + + public Criteria andFuncGreaterThan(String value) { + addCriterion("func >", value, "func"); + return (Criteria) this; + } + + public Criteria andFuncGreaterThanOrEqualTo(String value) { + addCriterion("func >=", value, "func"); + return (Criteria) this; + } + + public Criteria andFuncLessThan(String value) { + addCriterion("func <", value, "func"); + return (Criteria) this; + } + + public Criteria andFuncLessThanOrEqualTo(String value) { + addCriterion("func <=", value, "func"); + return (Criteria) this; + } + + public Criteria andFuncLike(String value) { + addCriterion("func like", value, "func"); + return (Criteria) this; + } + + public Criteria andFuncNotLike(String value) { + addCriterion("func not like", value, "func"); + return (Criteria) this; + } + + public Criteria andFuncIn(List values) { + addCriterion("func in", values, "func"); + return (Criteria) this; + } + + public Criteria andFuncNotIn(List values) { + addCriterion("func not in", values, "func"); + return (Criteria) this; + } + + public Criteria andFuncBetween(String value1, String value2) { + addCriterion("func between", value1, value2, "func"); + return (Criteria) this; + } + + public Criteria andFuncNotBetween(String value1, String value2) { + addCriterion("func not between", value1, value2, "func"); + return (Criteria) this; + } + + public Criteria andDbTypeIsNull() { + addCriterion("db_type is null"); + return (Criteria) this; + } + + public Criteria andDbTypeIsNotNull() { + addCriterion("db_type is not null"); + return (Criteria) this; + } + + public Criteria andDbTypeEqualTo(String value) { + addCriterion("db_type =", value, "dbType"); + return (Criteria) this; + } + + public Criteria andDbTypeNotEqualTo(String value) { + addCriterion("db_type <>", value, "dbType"); + return (Criteria) this; + } + + public Criteria andDbTypeGreaterThan(String value) { + addCriterion("db_type >", value, "dbType"); + return (Criteria) this; + } + + public Criteria andDbTypeGreaterThanOrEqualTo(String value) { + addCriterion("db_type >=", value, "dbType"); + return (Criteria) this; + } + + public Criteria andDbTypeLessThan(String value) { + addCriterion("db_type <", value, "dbType"); + return (Criteria) this; + } + + public Criteria andDbTypeLessThanOrEqualTo(String value) { + addCriterion("db_type <=", value, "dbType"); + return (Criteria) this; + } + + public Criteria andDbTypeLike(String value) { + addCriterion("db_type like", value, "dbType"); + return (Criteria) this; + } + + public Criteria andDbTypeNotLike(String value) { + addCriterion("db_type not like", value, "dbType"); + return (Criteria) this; + } + + public Criteria andDbTypeIn(List values) { + addCriterion("db_type in", values, "dbType"); + return (Criteria) this; + } + + public Criteria andDbTypeNotIn(List values) { + addCriterion("db_type not in", values, "dbType"); + return (Criteria) this; + } + + public Criteria andDbTypeBetween(String value1, String value2) { + addCriterion("db_type between", value1, value2, "dbType"); + return (Criteria) this; + } + + public Criteria andDbTypeNotBetween(String value1, String value2) { + addCriterion("db_type not between", value1, value2, "dbType"); + return (Criteria) this; + } + + public Criteria andFuncTypeIsNull() { + addCriterion("func_type is null"); + return (Criteria) this; + } + + public Criteria andFuncTypeIsNotNull() { + addCriterion("func_type is not null"); + return (Criteria) this; + } + + public Criteria andFuncTypeEqualTo(Integer value) { + addCriterion("func_type =", value, "funcType"); + return (Criteria) this; + } + + public Criteria andFuncTypeNotEqualTo(Integer value) { + addCriterion("func_type <>", value, "funcType"); + return (Criteria) this; + } + + public Criteria andFuncTypeGreaterThan(Integer value) { + addCriterion("func_type >", value, "funcType"); + return (Criteria) this; + } + + public Criteria andFuncTypeGreaterThanOrEqualTo(Integer value) { + addCriterion("func_type >=", value, "funcType"); + return (Criteria) this; + } + + public Criteria andFuncTypeLessThan(Integer value) { + addCriterion("func_type <", value, "funcType"); + return (Criteria) this; + } + + public Criteria andFuncTypeLessThanOrEqualTo(Integer value) { + addCriterion("func_type <=", value, "funcType"); + return (Criteria) this; + } + + public Criteria andFuncTypeIn(List values) { + addCriterion("func_type in", values, "funcType"); + return (Criteria) this; + } + + public Criteria andFuncTypeNotIn(List values) { + addCriterion("func_type not in", values, "funcType"); + return (Criteria) this; + } + + public Criteria andFuncTypeBetween(Integer value1, Integer value2) { + addCriterion("func_type between", value1, value2, "funcType"); + return (Criteria) this; + } + + public Criteria andFuncTypeNotBetween(Integer value1, Integer value2) { + addCriterion("func_type not between", value1, value2, "funcType"); + return (Criteria) this; + } + } + + public static class Criteria extends GeneratedCriteria { + + protected Criteria() { + super(); + } + } + + public static class Criterion { + private String condition; + + private Object value; + + private Object secondValue; + + private boolean noValue; + + private boolean singleValue; + + private boolean betweenValue; + + private boolean listValue; + + private String typeHandler; + + public String getCondition() { + return condition; + } + + public Object getValue() { + return value; + } + + public Object getSecondValue() { + return secondValue; + } + + public boolean isNoValue() { + return noValue; + } + + public boolean isSingleValue() { + return singleValue; + } + + public boolean isBetweenValue() { + return betweenValue; + } + + public boolean isListValue() { + return listValue; + } + + public String getTypeHandler() { + return typeHandler; + } + + protected Criterion(String condition) { + super(); + this.condition = condition; + this.typeHandler = null; + this.noValue = true; + } + + protected Criterion(String condition, Object value, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.typeHandler = typeHandler; + if (value instanceof List) { + this.listValue = true; + } else { + this.singleValue = true; + } + } + + protected Criterion(String condition, Object value) { + this(condition, value, null); + } + + protected Criterion(String condition, Object value, Object secondValue, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.secondValue = secondValue; + this.typeHandler = typeHandler; + this.betweenValue = true; + } + + protected Criterion(String condition, Object value, Object secondValue) { + this(condition, value, secondValue, null); + } + } +} \ No newline at end of file diff --git a/backend/src/main/java/io/dataease/base/mapper/DatasetTableFunctionMapper.java b/backend/src/main/java/io/dataease/base/mapper/DatasetTableFunctionMapper.java new file mode 100644 index 0000000000..ddd5f3787a --- /dev/null +++ b/backend/src/main/java/io/dataease/base/mapper/DatasetTableFunctionMapper.java @@ -0,0 +1,36 @@ +package io.dataease.base.mapper; + +import io.dataease.base.domain.DatasetTableFunction; +import io.dataease.base.domain.DatasetTableFunctionExample; +import java.util.List; +import org.apache.ibatis.annotations.Param; + +public interface DatasetTableFunctionMapper { + long countByExample(DatasetTableFunctionExample example); + + int deleteByExample(DatasetTableFunctionExample example); + + int deleteByPrimaryKey(Long id); + + int insert(DatasetTableFunction record); + + int insertSelective(DatasetTableFunction record); + + List selectByExampleWithBLOBs(DatasetTableFunctionExample example); + + List selectByExample(DatasetTableFunctionExample example); + + DatasetTableFunction selectByPrimaryKey(Long id); + + int updateByExampleSelective(@Param("record") DatasetTableFunction record, @Param("example") DatasetTableFunctionExample example); + + int updateByExampleWithBLOBs(@Param("record") DatasetTableFunction record, @Param("example") DatasetTableFunctionExample example); + + int updateByExample(@Param("record") DatasetTableFunction record, @Param("example") DatasetTableFunctionExample example); + + int updateByPrimaryKeySelective(DatasetTableFunction record); + + int updateByPrimaryKeyWithBLOBs(DatasetTableFunction record); + + int updateByPrimaryKey(DatasetTableFunction record); +} \ No newline at end of file diff --git a/backend/src/main/java/io/dataease/base/mapper/DatasetTableFunctionMapper.xml b/backend/src/main/java/io/dataease/base/mapper/DatasetTableFunctionMapper.xml new file mode 100644 index 0000000000..3f82540c50 --- /dev/null +++ b/backend/src/main/java/io/dataease/base/mapper/DatasetTableFunctionMapper.xml @@ -0,0 +1,270 @@ + + + + + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + id, `name`, func, db_type, func_type + + + `desc` + + + + + + delete from dataset_table_function + where id = #{id,jdbcType=BIGINT} + + + delete from dataset_table_function + + + + + + insert into dataset_table_function (id, `name`, func, + db_type, func_type, `desc` + ) + values (#{id,jdbcType=BIGINT}, #{name,jdbcType=VARCHAR}, #{func,jdbcType=VARCHAR}, + #{dbType,jdbcType=VARCHAR}, #{funcType,jdbcType=INTEGER}, #{desc,jdbcType=LONGVARCHAR} + ) + + + insert into dataset_table_function + + + id, + + + `name`, + + + func, + + + db_type, + + + func_type, + + + `desc`, + + + + + #{id,jdbcType=BIGINT}, + + + #{name,jdbcType=VARCHAR}, + + + #{func,jdbcType=VARCHAR}, + + + #{dbType,jdbcType=VARCHAR}, + + + #{funcType,jdbcType=INTEGER}, + + + #{desc,jdbcType=LONGVARCHAR}, + + + + + + update dataset_table_function + + + id = #{record.id,jdbcType=BIGINT}, + + + `name` = #{record.name,jdbcType=VARCHAR}, + + + func = #{record.func,jdbcType=VARCHAR}, + + + db_type = #{record.dbType,jdbcType=VARCHAR}, + + + func_type = #{record.funcType,jdbcType=INTEGER}, + + + `desc` = #{record.desc,jdbcType=LONGVARCHAR}, + + + + + + + + update dataset_table_function + set id = #{record.id,jdbcType=BIGINT}, + `name` = #{record.name,jdbcType=VARCHAR}, + func = #{record.func,jdbcType=VARCHAR}, + db_type = #{record.dbType,jdbcType=VARCHAR}, + func_type = #{record.funcType,jdbcType=INTEGER}, + `desc` = #{record.desc,jdbcType=LONGVARCHAR} + + + + + + update dataset_table_function + set id = #{record.id,jdbcType=BIGINT}, + `name` = #{record.name,jdbcType=VARCHAR}, + func = #{record.func,jdbcType=VARCHAR}, + db_type = #{record.dbType,jdbcType=VARCHAR}, + func_type = #{record.funcType,jdbcType=INTEGER} + + + + + + update dataset_table_function + + + `name` = #{name,jdbcType=VARCHAR}, + + + func = #{func,jdbcType=VARCHAR}, + + + db_type = #{dbType,jdbcType=VARCHAR}, + + + func_type = #{funcType,jdbcType=INTEGER}, + + + `desc` = #{desc,jdbcType=LONGVARCHAR}, + + + where id = #{id,jdbcType=BIGINT} + + + update dataset_table_function + set `name` = #{name,jdbcType=VARCHAR}, + func = #{func,jdbcType=VARCHAR}, + db_type = #{dbType,jdbcType=VARCHAR}, + func_type = #{funcType,jdbcType=INTEGER}, + `desc` = #{desc,jdbcType=LONGVARCHAR} + where id = #{id,jdbcType=BIGINT} + + + update dataset_table_function + set `name` = #{name,jdbcType=VARCHAR}, + func = #{func,jdbcType=VARCHAR}, + db_type = #{dbType,jdbcType=VARCHAR}, + func_type = #{funcType,jdbcType=INTEGER} + where id = #{id,jdbcType=BIGINT} + + \ No newline at end of file diff --git a/backend/src/main/java/io/dataease/base/mapper/ext/ExtDataSetTaskMapper.xml b/backend/src/main/java/io/dataease/base/mapper/ext/ExtDataSetTaskMapper.xml index 88b361896c..02682072d7 100644 --- a/backend/src/main/java/io/dataease/base/mapper/ext/ExtDataSetTaskMapper.xml +++ b/backend/src/main/java/io/dataease/base/mapper/ext/ExtDataSetTaskMapper.xml @@ -10,12 +10,13 @@ +