diff --git a/backend/pom.xml b/backend/pom.xml index 177a028f21..0add4657ae 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -326,6 +326,11 @@ hbase-common 2.4.1 + + org.apache.hbase + hbase-mapreduce + 2.4.1 + org.testng @@ -347,6 +352,10 @@ log4j log4j + + org.objenesis + objenesis + provided diff --git a/backend/src/main/java/io/dataease/auth/config/F2CRealm.java b/backend/src/main/java/io/dataease/auth/config/F2CRealm.java index 5d686c2abe..46b942ef48 100644 --- a/backend/src/main/java/io/dataease/auth/config/F2CRealm.java +++ b/backend/src/main/java/io/dataease/auth/config/F2CRealm.java @@ -1,10 +1,13 @@ package io.dataease.auth.config; +import io.dataease.auth.api.dto.CurrentRoleDto; +import io.dataease.auth.api.dto.CurrentUserDto; import io.dataease.auth.entity.JWTToken; import io.dataease.auth.entity.SysUserEntity; import io.dataease.auth.entity.TokenInfo; import io.dataease.auth.service.AuthUserService; import io.dataease.auth.util.JWTUtils; +import io.dataease.commons.utils.BeanUtils; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.AuthenticationInfo; import org.apache.shiro.authc.AuthenticationToken; @@ -16,6 +19,8 @@ import org.apache.shiro.subject.PrincipalCollection; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; + +import java.util.List; import java.util.Set; import java.util.stream.Collectors; @@ -58,7 +63,7 @@ public class F2CRealm extends AuthorizingRealm { if (username == null) { throw new AuthenticationException("token invalid"); } - + // 使用缓存 SysUserEntity user = authUserService.getUserById(userId); if (user == null) { throw new AuthenticationException("User didn't existed!"); @@ -72,6 +77,13 @@ public class F2CRealm extends AuthorizingRealm { if (! JWTUtils.verify(token, tokenInfo, pass)) { throw new AuthenticationException("Username or password error"); } - return new SimpleAuthenticationInfo(token, token, "f2cReam"); + // 使用缓存 + List currentRoleDtos = authUserService.roleInfos(user.getUserId()); + // 使用缓存 + List permissions = authUserService.permissions(user.getUserId()); + CurrentUserDto currentUserDto = BeanUtils.copyBean(new CurrentUserDto(), user); + currentUserDto.setRoles(currentRoleDtos); + currentUserDto.setPermissions(permissions); + return new SimpleAuthenticationInfo(currentUserDto, token, "f2cReam"); } } diff --git a/backend/src/main/java/io/dataease/auth/server/AuthServer.java b/backend/src/main/java/io/dataease/auth/server/AuthServer.java index 474e013a69..a3a1640706 100644 --- a/backend/src/main/java/io/dataease/auth/server/AuthServer.java +++ b/backend/src/main/java/io/dataease/auth/server/AuthServer.java @@ -15,6 +15,7 @@ import io.dataease.commons.utils.CodingUtil; import io.dataease.commons.utils.ServletUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.shiro.SecurityUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @@ -58,19 +59,26 @@ public class AuthServer implements AuthApi { @Override public CurrentUserDto userInfo() { - String token = ServletUtils.getToken(); - Long userId = JWTUtils.tokenInfoByToken(token).getUserId(); - SysUserEntity user = authUserService.getUserById(userId); - CurrentUserDto currentUserDto = BeanUtils.copyBean(new CurrentUserDto(), user); - List currentRoleDtos = authUserService.roleInfos(user.getUserId()); - List permissions = authUserService.permissions(user.getUserId()); - currentUserDto.setRoles(currentRoleDtos); - currentUserDto.setPermissions(permissions); - return currentUserDto; + CurrentUserDto userDto = (CurrentUserDto)SecurityUtils.getSubject().getPrincipal(); + if (ObjectUtils.isEmpty(userDto)) { + String token = ServletUtils.getToken(); + Long userId = JWTUtils.tokenInfoByToken(token).getUserId(); + SysUserEntity user = authUserService.getUserById(userId); + CurrentUserDto currentUserDto = BeanUtils.copyBean(new CurrentUserDto(), user); + List currentRoleDtos = authUserService.roleInfos(user.getUserId()); + List permissions = authUserService.permissions(user.getUserId()); + currentUserDto.setRoles(currentRoleDtos); + currentUserDto.setPermissions(permissions); + return currentUserDto; + } + return userDto; } @Override public String logout(){ + String token = ServletUtils.getToken(); + Long userId = JWTUtils.tokenInfoByToken(token).getUserId(); + authUserService.clearCache(userId); return "success"; } diff --git a/backend/src/main/java/io/dataease/auth/service/AuthUserService.java b/backend/src/main/java/io/dataease/auth/service/AuthUserService.java index 2eb887365d..8154412bbd 100644 --- a/backend/src/main/java/io/dataease/auth/service/AuthUserService.java +++ b/backend/src/main/java/io/dataease/auth/service/AuthUserService.java @@ -19,6 +19,8 @@ public interface AuthUserService { List roleInfos(Long userId); + void clearCache(Long userId); + } diff --git a/backend/src/main/java/io/dataease/auth/service/impl/AuthUserServiceImpl.java b/backend/src/main/java/io/dataease/auth/service/impl/AuthUserServiceImpl.java index e4fde7aba2..7254206150 100644 --- a/backend/src/main/java/io/dataease/auth/service/impl/AuthUserServiceImpl.java +++ b/backend/src/main/java/io/dataease/auth/service/impl/AuthUserServiceImpl.java @@ -4,8 +4,11 @@ import io.dataease.auth.api.dto.CurrentRoleDto; import io.dataease.auth.entity.SysUserEntity; import io.dataease.base.mapper.ext.AuthMapper; import io.dataease.auth.service.AuthUserService; +import io.dataease.commons.constants.AuthConstants; import org.apache.commons.lang3.StringUtils; +import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; +import org.springframework.cache.annotation.Caching; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -16,7 +19,6 @@ import java.util.stream.Collectors; @Service public class AuthUserServiceImpl implements AuthUserService { - private final String USER_CACHE_NAME = "users_info"; @Resource private AuthMapper authMapper; @@ -26,7 +28,7 @@ public class AuthUserServiceImpl implements AuthUserService { * @param userId * @return */ - @Cacheable(value = USER_CACHE_NAME, key = "'user' + #userId" ) + @Cacheable(value = AuthConstants.USER_CACHE_NAME, key = "'user' + #userId" ) @Override public SysUserEntity getUserById(Long userId){ return authMapper.findUser(userId); @@ -41,14 +43,42 @@ public class AuthUserServiceImpl implements AuthUserService { public List roles(Long userId){ return authMapper.roleCodes(userId); } + + /** + * 此处需被F2CRealm登录认证调用 也就是说每次请求都会被调用 所以最好加上缓存 + * @param userId + * @return + */ + @Cacheable(value = AuthConstants.USER_PERMISSION_CACHE_NAME, key = "'user' + #userId" ) @Override public List permissions(Long userId){ List permissions = authMapper.permissions(userId); return permissions.stream().filter(StringUtils::isNotEmpty).collect(Collectors.toList()); } + /** + * 此处需被F2CRealm登录认证调用 也就是说每次请求都会被调用 所以最好加上缓存 + * @param userId + * @return + */ + @Cacheable(value = AuthConstants.USER_ROLE_CACHE_NAME, key = "'user' + #userId" ) @Override public List roleInfos(Long userId) { return authMapper.roles(userId); } + + + /** + * 一波清除3个缓存 + * @param userId + */ + @Caching(evict = { + @CacheEvict(value = AuthConstants.USER_CACHE_NAME, key = "'user' + #userId"), + @CacheEvict(value = AuthConstants.USER_ROLE_CACHE_NAME, key = "'user' + #userId"), + @CacheEvict(value = AuthConstants.USER_PERMISSION_CACHE_NAME, key = "'user' + #userId") + }) + @Override + public void clearCache(Long userId) { + + } } diff --git a/backend/src/main/java/io/dataease/base/domain/DatasetTableIncrementalConfig.java b/backend/src/main/java/io/dataease/base/domain/DatasetTableIncrementalConfig.java new file mode 100644 index 0000000000..33b94f2d03 --- /dev/null +++ b/backend/src/main/java/io/dataease/base/domain/DatasetTableIncrementalConfig.java @@ -0,0 +1,17 @@ +package io.dataease.base.domain; + +import java.io.Serializable; +import lombok.Data; + +@Data +public class DatasetTableIncrementalConfig implements Serializable { + private String id; + + private String tableId; + + private String incrementalDelete; + + private String incrementalAdd; + + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/backend/src/main/java/io/dataease/base/domain/DatasetTableIncrementalConfigExample.java b/backend/src/main/java/io/dataease/base/domain/DatasetTableIncrementalConfigExample.java new file mode 100644 index 0000000000..9750acef68 --- /dev/null +++ b/backend/src/main/java/io/dataease/base/domain/DatasetTableIncrementalConfigExample.java @@ -0,0 +1,480 @@ +package io.dataease.base.domain; + +import java.util.ArrayList; +import java.util.List; + +public class DatasetTableIncrementalConfigExample { + protected String orderByClause; + + protected boolean distinct; + + protected List oredCriteria; + + public DatasetTableIncrementalConfigExample() { + 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(String value) { + addCriterion("id =", value, "id"); + return (Criteria) this; + } + + public Criteria andIdNotEqualTo(String value) { + addCriterion("id <>", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThan(String value) { + addCriterion("id >", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThanOrEqualTo(String value) { + addCriterion("id >=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThan(String value) { + addCriterion("id <", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThanOrEqualTo(String value) { + addCriterion("id <=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLike(String value) { + addCriterion("id like", value, "id"); + return (Criteria) this; + } + + public Criteria andIdNotLike(String value) { + addCriterion("id not like", 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(String value1, String value2) { + addCriterion("id between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andIdNotBetween(String value1, String value2) { + addCriterion("id not between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andTableIdIsNull() { + addCriterion("table_id is null"); + return (Criteria) this; + } + + public Criteria andTableIdIsNotNull() { + addCriterion("table_id is not null"); + return (Criteria) this; + } + + public Criteria andTableIdEqualTo(String value) { + addCriterion("table_id =", value, "tableId"); + return (Criteria) this; + } + + public Criteria andTableIdNotEqualTo(String value) { + addCriterion("table_id <>", value, "tableId"); + return (Criteria) this; + } + + public Criteria andTableIdGreaterThan(String value) { + addCriterion("table_id >", value, "tableId"); + return (Criteria) this; + } + + public Criteria andTableIdGreaterThanOrEqualTo(String value) { + addCriterion("table_id >=", value, "tableId"); + return (Criteria) this; + } + + public Criteria andTableIdLessThan(String value) { + addCriterion("table_id <", value, "tableId"); + return (Criteria) this; + } + + public Criteria andTableIdLessThanOrEqualTo(String value) { + addCriterion("table_id <=", value, "tableId"); + return (Criteria) this; + } + + public Criteria andTableIdLike(String value) { + addCriterion("table_id like", value, "tableId"); + return (Criteria) this; + } + + public Criteria andTableIdNotLike(String value) { + addCriterion("table_id not like", value, "tableId"); + return (Criteria) this; + } + + public Criteria andTableIdIn(List values) { + addCriterion("table_id in", values, "tableId"); + return (Criteria) this; + } + + public Criteria andTableIdNotIn(List values) { + addCriterion("table_id not in", values, "tableId"); + return (Criteria) this; + } + + public Criteria andTableIdBetween(String value1, String value2) { + addCriterion("table_id between", value1, value2, "tableId"); + return (Criteria) this; + } + + public Criteria andTableIdNotBetween(String value1, String value2) { + addCriterion("table_id not between", value1, value2, "tableId"); + return (Criteria) this; + } + + public Criteria andIncrementalDeleteIsNull() { + addCriterion("incremental_delete is null"); + return (Criteria) this; + } + + public Criteria andIncrementalDeleteIsNotNull() { + addCriterion("incremental_delete is not null"); + return (Criteria) this; + } + + public Criteria andIncrementalDeleteEqualTo(String value) { + addCriterion("incremental_delete =", value, "incrementalDelete"); + return (Criteria) this; + } + + public Criteria andIncrementalDeleteNotEqualTo(String value) { + addCriterion("incremental_delete <>", value, "incrementalDelete"); + return (Criteria) this; + } + + public Criteria andIncrementalDeleteGreaterThan(String value) { + addCriterion("incremental_delete >", value, "incrementalDelete"); + return (Criteria) this; + } + + public Criteria andIncrementalDeleteGreaterThanOrEqualTo(String value) { + addCriterion("incremental_delete >=", value, "incrementalDelete"); + return (Criteria) this; + } + + public Criteria andIncrementalDeleteLessThan(String value) { + addCriterion("incremental_delete <", value, "incrementalDelete"); + return (Criteria) this; + } + + public Criteria andIncrementalDeleteLessThanOrEqualTo(String value) { + addCriterion("incremental_delete <=", value, "incrementalDelete"); + return (Criteria) this; + } + + public Criteria andIncrementalDeleteLike(String value) { + addCriterion("incremental_delete like", value, "incrementalDelete"); + return (Criteria) this; + } + + public Criteria andIncrementalDeleteNotLike(String value) { + addCriterion("incremental_delete not like", value, "incrementalDelete"); + return (Criteria) this; + } + + public Criteria andIncrementalDeleteIn(List values) { + addCriterion("incremental_delete in", values, "incrementalDelete"); + return (Criteria) this; + } + + public Criteria andIncrementalDeleteNotIn(List values) { + addCriterion("incremental_delete not in", values, "incrementalDelete"); + return (Criteria) this; + } + + public Criteria andIncrementalDeleteBetween(String value1, String value2) { + addCriterion("incremental_delete between", value1, value2, "incrementalDelete"); + return (Criteria) this; + } + + public Criteria andIncrementalDeleteNotBetween(String value1, String value2) { + addCriterion("incremental_delete not between", value1, value2, "incrementalDelete"); + return (Criteria) this; + } + + public Criteria andIncrementalAddIsNull() { + addCriterion("incremental_add is null"); + return (Criteria) this; + } + + public Criteria andIncrementalAddIsNotNull() { + addCriterion("incremental_add is not null"); + return (Criteria) this; + } + + public Criteria andIncrementalAddEqualTo(String value) { + addCriterion("incremental_add =", value, "incrementalAdd"); + return (Criteria) this; + } + + public Criteria andIncrementalAddNotEqualTo(String value) { + addCriterion("incremental_add <>", value, "incrementalAdd"); + return (Criteria) this; + } + + public Criteria andIncrementalAddGreaterThan(String value) { + addCriterion("incremental_add >", value, "incrementalAdd"); + return (Criteria) this; + } + + public Criteria andIncrementalAddGreaterThanOrEqualTo(String value) { + addCriterion("incremental_add >=", value, "incrementalAdd"); + return (Criteria) this; + } + + public Criteria andIncrementalAddLessThan(String value) { + addCriterion("incremental_add <", value, "incrementalAdd"); + return (Criteria) this; + } + + public Criteria andIncrementalAddLessThanOrEqualTo(String value) { + addCriterion("incremental_add <=", value, "incrementalAdd"); + return (Criteria) this; + } + + public Criteria andIncrementalAddLike(String value) { + addCriterion("incremental_add like", value, "incrementalAdd"); + return (Criteria) this; + } + + public Criteria andIncrementalAddNotLike(String value) { + addCriterion("incremental_add not like", value, "incrementalAdd"); + return (Criteria) this; + } + + public Criteria andIncrementalAddIn(List values) { + addCriterion("incremental_add in", values, "incrementalAdd"); + return (Criteria) this; + } + + public Criteria andIncrementalAddNotIn(List values) { + addCriterion("incremental_add not in", values, "incrementalAdd"); + return (Criteria) this; + } + + public Criteria andIncrementalAddBetween(String value1, String value2) { + addCriterion("incremental_add between", value1, value2, "incrementalAdd"); + return (Criteria) this; + } + + public Criteria andIncrementalAddNotBetween(String value1, String value2) { + addCriterion("incremental_add not between", value1, value2, "incrementalAdd"); + 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/domain/PanelShare.java b/backend/src/main/java/io/dataease/base/domain/PanelShare.java index 5d45eca63a..ab0c0bfe11 100644 --- a/backend/src/main/java/io/dataease/base/domain/PanelShare.java +++ b/backend/src/main/java/io/dataease/base/domain/PanelShare.java @@ -9,9 +9,11 @@ public class PanelShare implements Serializable { private String panelGroupId; - private Long userId; + private Long targetId; private Long createTime; + private Integer type; + private static final long serialVersionUID = 1L; } \ No newline at end of file diff --git a/backend/src/main/java/io/dataease/base/domain/PanelShareExample.java b/backend/src/main/java/io/dataease/base/domain/PanelShareExample.java index 887d2f1d8c..0f589d6f3d 100644 --- a/backend/src/main/java/io/dataease/base/domain/PanelShareExample.java +++ b/backend/src/main/java/io/dataease/base/domain/PanelShareExample.java @@ -234,63 +234,63 @@ public class PanelShareExample { return (Criteria) this; } - public Criteria andUserIdIsNull() { - addCriterion("user_id is null"); + public Criteria andTargetIdIsNull() { + addCriterion("target_id is null"); return (Criteria) this; } - public Criteria andUserIdIsNotNull() { - addCriterion("user_id is not null"); + public Criteria andTargetIdIsNotNull() { + addCriterion("target_id is not null"); return (Criteria) this; } - public Criteria andUserIdEqualTo(Long value) { - addCriterion("user_id =", value, "userId"); + public Criteria andTargetIdEqualTo(Long value) { + addCriterion("target_id =", value, "targetId"); return (Criteria) this; } - public Criteria andUserIdNotEqualTo(Long value) { - addCriterion("user_id <>", value, "userId"); + public Criteria andTargetIdNotEqualTo(Long value) { + addCriterion("target_id <>", value, "targetId"); return (Criteria) this; } - public Criteria andUserIdGreaterThan(Long value) { - addCriterion("user_id >", value, "userId"); + public Criteria andTargetIdGreaterThan(Long value) { + addCriterion("target_id >", value, "targetId"); return (Criteria) this; } - public Criteria andUserIdGreaterThanOrEqualTo(Long value) { - addCriterion("user_id >=", value, "userId"); + public Criteria andTargetIdGreaterThanOrEqualTo(Long value) { + addCriterion("target_id >=", value, "targetId"); return (Criteria) this; } - public Criteria andUserIdLessThan(Long value) { - addCriterion("user_id <", value, "userId"); + public Criteria andTargetIdLessThan(Long value) { + addCriterion("target_id <", value, "targetId"); return (Criteria) this; } - public Criteria andUserIdLessThanOrEqualTo(Long value) { - addCriterion("user_id <=", value, "userId"); + public Criteria andTargetIdLessThanOrEqualTo(Long value) { + addCriterion("target_id <=", value, "targetId"); return (Criteria) this; } - public Criteria andUserIdIn(List values) { - addCriterion("user_id in", values, "userId"); + public Criteria andTargetIdIn(List values) { + addCriterion("target_id in", values, "targetId"); return (Criteria) this; } - public Criteria andUserIdNotIn(List values) { - addCriterion("user_id not in", values, "userId"); + public Criteria andTargetIdNotIn(List values) { + addCriterion("target_id not in", values, "targetId"); return (Criteria) this; } - public Criteria andUserIdBetween(Long value1, Long value2) { - addCriterion("user_id between", value1, value2, "userId"); + public Criteria andTargetIdBetween(Long value1, Long value2) { + addCriterion("target_id between", value1, value2, "targetId"); return (Criteria) this; } - public Criteria andUserIdNotBetween(Long value1, Long value2) { - addCriterion("user_id not between", value1, value2, "userId"); + public Criteria andTargetIdNotBetween(Long value1, Long value2) { + addCriterion("target_id not between", value1, value2, "targetId"); return (Criteria) this; } @@ -353,6 +353,66 @@ public class PanelShareExample { addCriterion("create_time not between", value1, value2, "createTime"); return (Criteria) this; } + + public Criteria andTypeIsNull() { + addCriterion("`type` is null"); + return (Criteria) this; + } + + public Criteria andTypeIsNotNull() { + addCriterion("`type` is not null"); + return (Criteria) this; + } + + public Criteria andTypeEqualTo(Integer value) { + addCriterion("`type` =", value, "type"); + return (Criteria) this; + } + + public Criteria andTypeNotEqualTo(Integer value) { + addCriterion("`type` <>", value, "type"); + return (Criteria) this; + } + + public Criteria andTypeGreaterThan(Integer value) { + addCriterion("`type` >", value, "type"); + return (Criteria) this; + } + + public Criteria andTypeGreaterThanOrEqualTo(Integer value) { + addCriterion("`type` >=", value, "type"); + return (Criteria) this; + } + + public Criteria andTypeLessThan(Integer value) { + addCriterion("`type` <", value, "type"); + return (Criteria) this; + } + + public Criteria andTypeLessThanOrEqualTo(Integer value) { + addCriterion("`type` <=", value, "type"); + return (Criteria) this; + } + + public Criteria andTypeIn(List values) { + addCriterion("`type` in", values, "type"); + return (Criteria) this; + } + + public Criteria andTypeNotIn(List values) { + addCriterion("`type` not in", values, "type"); + return (Criteria) this; + } + + public Criteria andTypeBetween(Integer value1, Integer value2) { + addCriterion("`type` between", value1, value2, "type"); + return (Criteria) this; + } + + public Criteria andTypeNotBetween(Integer value1, Integer value2) { + addCriterion("`type` not between", value1, value2, "type"); + return (Criteria) this; + } } public static class Criteria extends GeneratedCriteria { diff --git a/backend/src/main/java/io/dataease/base/mapper/DatasetTableIncrementalConfigMapper.java b/backend/src/main/java/io/dataease/base/mapper/DatasetTableIncrementalConfigMapper.java new file mode 100644 index 0000000000..dc7637adf3 --- /dev/null +++ b/backend/src/main/java/io/dataease/base/mapper/DatasetTableIncrementalConfigMapper.java @@ -0,0 +1,22 @@ +package io.dataease.base.mapper; + +import io.dataease.base.domain.DatasetTableIncrementalConfig; +import io.dataease.base.domain.DatasetTableIncrementalConfigExample; +import java.util.List; +import org.apache.ibatis.annotations.Param; + +public interface DatasetTableIncrementalConfigMapper { + long countByExample(DatasetTableIncrementalConfigExample example); + + int deleteByExample(DatasetTableIncrementalConfigExample example); + + int insert(DatasetTableIncrementalConfig record); + + int insertSelective(DatasetTableIncrementalConfig record); + + List selectByExample(DatasetTableIncrementalConfigExample example); + + int updateByExampleSelective(@Param("record") DatasetTableIncrementalConfig record, @Param("example") DatasetTableIncrementalConfigExample example); + + int updateByExample(@Param("record") DatasetTableIncrementalConfig record, @Param("example") DatasetTableIncrementalConfigExample example); +} \ No newline at end of file diff --git a/backend/src/main/java/io/dataease/base/mapper/DatasetTableIncrementalConfigMapper.xml b/backend/src/main/java/io/dataease/base/mapper/DatasetTableIncrementalConfigMapper.xml new file mode 100644 index 0000000000..b21c1704da --- /dev/null +++ b/backend/src/main/java/io/dataease/base/mapper/DatasetTableIncrementalConfigMapper.xml @@ -0,0 +1,164 @@ + + + + + + + + + + + + + + + + + + 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, table_id, incremental_delete, incremental_add + + + + delete from dataset_table_incremental_config + + + + + + insert into dataset_table_incremental_config (id, table_id, incremental_delete, + incremental_add) + values (#{id,jdbcType=VARCHAR}, #{tableId,jdbcType=VARCHAR}, #{incrementalDelete,jdbcType=VARCHAR}, + #{incrementalAdd,jdbcType=VARCHAR}) + + + insert into dataset_table_incremental_config + + + id, + + + table_id, + + + incremental_delete, + + + incremental_add, + + + + + #{id,jdbcType=VARCHAR}, + + + #{tableId,jdbcType=VARCHAR}, + + + #{incrementalDelete,jdbcType=VARCHAR}, + + + #{incrementalAdd,jdbcType=VARCHAR}, + + + + + + update dataset_table_incremental_config + + + id = #{record.id,jdbcType=VARCHAR}, + + + table_id = #{record.tableId,jdbcType=VARCHAR}, + + + incremental_delete = #{record.incrementalDelete,jdbcType=VARCHAR}, + + + incremental_add = #{record.incrementalAdd,jdbcType=VARCHAR}, + + + + + + + + update dataset_table_incremental_config + set id = #{record.id,jdbcType=VARCHAR}, + table_id = #{record.tableId,jdbcType=VARCHAR}, + incremental_delete = #{record.incrementalDelete,jdbcType=VARCHAR}, + incremental_add = #{record.incrementalAdd,jdbcType=VARCHAR} + + + + + \ No newline at end of file diff --git a/backend/src/main/java/io/dataease/base/mapper/PanelShareMapper.xml b/backend/src/main/java/io/dataease/base/mapper/PanelShareMapper.xml index 7c4d62bdcc..fc57f983b7 100644 --- a/backend/src/main/java/io/dataease/base/mapper/PanelShareMapper.xml +++ b/backend/src/main/java/io/dataease/base/mapper/PanelShareMapper.xml @@ -4,8 +4,9 @@ - + + @@ -66,7 +67,7 @@ - share_id, panel_group_id, user_id, create_time + share_id, panel_group_id, target_id, create_time, `type` @@ -150,12 +157,15 @@ panel_group_id = #{record.panelGroupId,jdbcType=VARCHAR}, - - user_id = #{record.userId,jdbcType=BIGINT}, + + target_id = #{record.targetId,jdbcType=BIGINT}, create_time = #{record.createTime,jdbcType=BIGINT}, + + `type` = #{record.type,jdbcType=INTEGER}, + @@ -165,8 +175,9 @@ update panel_share set share_id = #{record.shareId,jdbcType=BIGINT}, panel_group_id = #{record.panelGroupId,jdbcType=VARCHAR}, - user_id = #{record.userId,jdbcType=BIGINT}, - create_time = #{record.createTime,jdbcType=BIGINT} + target_id = #{record.targetId,jdbcType=BIGINT}, + create_time = #{record.createTime,jdbcType=BIGINT}, + `type` = #{record.type,jdbcType=INTEGER} @@ -177,20 +188,24 @@ panel_group_id = #{panelGroupId,jdbcType=VARCHAR}, - - user_id = #{userId,jdbcType=BIGINT}, + + target_id = #{targetId,jdbcType=BIGINT}, create_time = #{createTime,jdbcType=BIGINT}, + + `type` = #{type,jdbcType=INTEGER}, + where share_id = #{shareId,jdbcType=BIGINT} update panel_share set panel_group_id = #{panelGroupId,jdbcType=VARCHAR}, - user_id = #{userId,jdbcType=BIGINT}, - create_time = #{createTime,jdbcType=BIGINT} + target_id = #{targetId,jdbcType=BIGINT}, + create_time = #{createTime,jdbcType=BIGINT}, + `type` = #{type,jdbcType=INTEGER} where share_id = #{shareId,jdbcType=BIGINT} \ No newline at end of file diff --git a/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelShareMapper.java b/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelShareMapper.java index 784e6317f1..a3c52468e1 100644 --- a/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelShareMapper.java +++ b/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelShareMapper.java @@ -3,12 +3,16 @@ package io.dataease.base.mapper.ext; import io.dataease.base.domain.PanelShare; import io.dataease.base.mapper.ext.query.GridExample; import io.dataease.dto.panel.PanelShareDto; +import io.dataease.dto.panel.PanelSharePo; +import org.apache.ibatis.annotations.Param; import java.util.List; public interface ExtPanelShareMapper { - int batchInsert(List shares); + int batchInsert(@Param("shares") List shares); - List query(GridExample example); + List query(GridExample example); + + List queryWithResource(GridExample example); } diff --git a/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelShareMapper.xml b/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelShareMapper.xml index 6da4ef665b..1d29450bb7 100644 --- a/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelShareMapper.xml +++ b/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelShareMapper.xml @@ -2,22 +2,22 @@ - + - + - - INSERT INTO panel_store (panel_group_id,user_id,create_time) + + INSERT INTO panel_share (panel_group_id,target_id,create_time,type) VALUES - - (#{store.panelGroupId}, #{store.userId}, #{store.createTime}) + + (#{share.panelGroupId}, #{share.targetId}, #{share.createTime}, #{share.type}) + + diff --git a/backend/src/main/java/io/dataease/commons/constants/AuthConstants.java b/backend/src/main/java/io/dataease/commons/constants/AuthConstants.java index bf6c0dac22..b78abf26f8 100644 --- a/backend/src/main/java/io/dataease/commons/constants/AuthConstants.java +++ b/backend/src/main/java/io/dataease/commons/constants/AuthConstants.java @@ -3,4 +3,9 @@ package io.dataease.commons.constants; public class AuthConstants { public final static String TOKEN_KEY = "Authorization"; + public final static String USER_CACHE_NAME = "users_info"; + public final static String USER_ROLE_CACHE_NAME = "users_roles_info"; + public final static String USER_PERMISSION_CACHE_NAME = "users_permissions_info"; + + } diff --git a/backend/src/main/java/io/dataease/commons/constants/ScheduleType.java b/backend/src/main/java/io/dataease/commons/constants/ScheduleType.java index 98b4fde4dd..18aeb65588 100644 --- a/backend/src/main/java/io/dataease/commons/constants/ScheduleType.java +++ b/backend/src/main/java/io/dataease/commons/constants/ScheduleType.java @@ -1,5 +1,5 @@ package io.dataease.commons.constants; public enum ScheduleType { - CRON, SIMPLE + CRON, SIMPLE, SIMPLE_COMPLETE } diff --git a/backend/src/main/java/io/dataease/commons/constants/UpdateType.java b/backend/src/main/java/io/dataease/commons/constants/UpdateType.java new file mode 100644 index 0000000000..0919e566af --- /dev/null +++ b/backend/src/main/java/io/dataease/commons/constants/UpdateType.java @@ -0,0 +1,5 @@ +package io.dataease.commons.constants; + +public enum UpdateType { + all_scope, add_scope +} diff --git a/backend/src/main/java/io/dataease/commons/utils/AuthUtils.java b/backend/src/main/java/io/dataease/commons/utils/AuthUtils.java index 5fcc32d725..e84b597d2d 100644 --- a/backend/src/main/java/io/dataease/commons/utils/AuthUtils.java +++ b/backend/src/main/java/io/dataease/commons/utils/AuthUtils.java @@ -1,9 +1,11 @@ package io.dataease.commons.utils; +import io.dataease.auth.api.dto.CurrentUserDto; import io.dataease.auth.entity.TokenInfo; import io.dataease.auth.util.JWTUtils; import io.dataease.base.domain.SysUser; import io.dataease.service.sys.SysUserService; +import org.apache.shiro.SecurityUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -17,12 +19,18 @@ public class AuthUtils { AuthUtils.sysUserService = sysUserService; } - public static SysUser getUser(){ + /*public static SysUser getUser(){ + SecurityUtils.getSubject().getPrincipal() String token = ServletUtils.getToken(); TokenInfo tokenInfo = JWTUtils.tokenInfoByToken(token); SysUser sysUser = new SysUser(); sysUser.setUserId(tokenInfo.getUserId()); SysUser user = sysUserService.findOne(sysUser); return user; + }*/ + + public static CurrentUserDto getUser(){ + CurrentUserDto userDto = (CurrentUserDto)SecurityUtils.getSubject().getPrincipal(); + return userDto; } } diff --git a/backend/src/main/java/io/dataease/controller/dataset/DataSetTableController.java b/backend/src/main/java/io/dataease/controller/dataset/DataSetTableController.java index 827386e0bb..7a902aa505 100644 --- a/backend/src/main/java/io/dataease/controller/dataset/DataSetTableController.java +++ b/backend/src/main/java/io/dataease/controller/dataset/DataSetTableController.java @@ -2,6 +2,7 @@ package io.dataease.controller.dataset; import io.dataease.base.domain.DatasetTable; import io.dataease.base.domain.DatasetTableField; +import io.dataease.base.domain.DatasetTableIncrementalConfig; import io.dataease.controller.request.dataset.DataSetTableRequest; import io.dataease.datasource.dto.TableFiled; import io.dataease.service.dataset.DataSetTableService; @@ -70,4 +71,15 @@ public class DataSetTableController { public Map getSQLPreview(@RequestBody DataSetTableRequest dataSetTableRequest) throws Exception { return dataSetTableService.getSQLPreview(dataSetTableRequest); } + + @PostMapping("incrementalConfig") + public DatasetTableIncrementalConfig incrementalConfig(@RequestBody DatasetTableIncrementalConfig datasetTableIncrementalConfig) throws Exception { + return dataSetTableService.incrementalConfig(datasetTableIncrementalConfig); + } + + @PostMapping("save/incrementalConfig") + public void saveIncrementalConfig(@RequestBody DatasetTableIncrementalConfig datasetTableIncrementalConfig) throws Exception { + dataSetTableService.saveIncrementalConfig(datasetTableIncrementalConfig); + } + } diff --git a/backend/src/main/java/io/dataease/controller/panel/api/ShareApi.java b/backend/src/main/java/io/dataease/controller/panel/api/ShareApi.java index f12e247fd6..14cc345578 100644 --- a/backend/src/main/java/io/dataease/controller/panel/api/ShareApi.java +++ b/backend/src/main/java/io/dataease/controller/panel/api/ShareApi.java @@ -1,5 +1,6 @@ package io.dataease.controller.panel.api; +import io.dataease.base.domain.PanelShare; import io.dataease.controller.request.panel.PanelShareRequest; import io.dataease.controller.sys.base.BaseGridRequest; import io.dataease.dto.panel.PanelShareDto; @@ -25,5 +26,10 @@ public interface ShareApi { @PostMapping("/treeList") List treeList(BaseGridRequest request); + + @ApiOperation("根据资源查询分享") + @PostMapping("/queryWithResourceId") + List queryWithResourceId(BaseGridRequest request); + } diff --git a/backend/src/main/java/io/dataease/controller/panel/server/ShareServer.java b/backend/src/main/java/io/dataease/controller/panel/server/ShareServer.java index 99fcad3163..82845e111b 100644 --- a/backend/src/main/java/io/dataease/controller/panel/server/ShareServer.java +++ b/backend/src/main/java/io/dataease/controller/panel/server/ShareServer.java @@ -1,15 +1,19 @@ package io.dataease.controller.panel.server; +import io.dataease.base.domain.PanelShare; import io.dataease.controller.panel.api.ShareApi; import io.dataease.controller.request.panel.PanelShareRequest; import io.dataease.controller.sys.base.BaseGridRequest; import io.dataease.dto.panel.PanelShareDto; import io.dataease.service.panel.ShareService; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.util.List; +@RestController public class ShareServer implements ShareApi { @Resource @@ -23,4 +27,10 @@ public class ShareServer implements ShareApi { public List treeList(@RequestBody BaseGridRequest request) { return shareService.queryTree(request); } + + + @Override + public List queryWithResourceId(@RequestBody BaseGridRequest request) { + return shareService.queryWithResource(request); + } } diff --git a/backend/src/main/java/io/dataease/controller/request/panel/PanelShareRequest.java b/backend/src/main/java/io/dataease/controller/request/panel/PanelShareRequest.java index 0a8c652fee..9025280cda 100644 --- a/backend/src/main/java/io/dataease/controller/request/panel/PanelShareRequest.java +++ b/backend/src/main/java/io/dataease/controller/request/panel/PanelShareRequest.java @@ -8,9 +8,10 @@ import java.util.List; @Data public class PanelShareRequest implements Serializable { - - @ApiModelProperty("分享目标用户集合") - private List userIds; + @ApiModelProperty(value = "分享目标类型", allowableValues = "0:user,1:role,2:dept") + private Integer type; + @ApiModelProperty("分享目标集合") + private List targetIds; @ApiModelProperty("分享仪表板集合") private List panelIds; } diff --git a/backend/src/main/java/io/dataease/controller/sys/SysUserController.java b/backend/src/main/java/io/dataease/controller/sys/SysUserController.java index 4fe8913321..259ac06695 100644 --- a/backend/src/main/java/io/dataease/controller/sys/SysUserController.java +++ b/backend/src/main/java/io/dataease/controller/sys/SysUserController.java @@ -49,7 +49,7 @@ public class SysUserController { sysUserService.update(request); } - @ApiOperation("更新用户") + @ApiOperation("删除用户") @PostMapping("/delete/{userId}") public void delete(@PathVariable("userId") Long userId){ sysUserService.delete(userId); diff --git a/backend/src/main/java/io/dataease/dto/panel/PanelShareDto.java b/backend/src/main/java/io/dataease/dto/panel/PanelShareDto.java index 0ad7dd3575..b8ce93f5b2 100644 --- a/backend/src/main/java/io/dataease/dto/panel/PanelShareDto.java +++ b/backend/src/main/java/io/dataease/dto/panel/PanelShareDto.java @@ -1,21 +1,15 @@ package io.dataease.dto.panel; import io.swagger.annotations.ApiModelProperty; -import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; import java.util.List; @Data -@Builder -public class PanelShareDto { +@NoArgsConstructor +public class PanelShareDto extends PanelSharePo{ - @ApiModelProperty("节点ID") - private String id; - @ApiModelProperty("名称") - private String name; - @ApiModelProperty("节点父ID") - private String creator; @ApiModelProperty("子节点") private List children; diff --git a/backend/src/main/java/io/dataease/dto/panel/PanelSharePo.java b/backend/src/main/java/io/dataease/dto/panel/PanelSharePo.java new file mode 100644 index 0000000000..b859d45317 --- /dev/null +++ b/backend/src/main/java/io/dataease/dto/panel/PanelSharePo.java @@ -0,0 +1,20 @@ +package io.dataease.dto.panel; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.NoArgsConstructor; + + +@Data +@NoArgsConstructor +public class PanelSharePo { + + @ApiModelProperty("节点ID") + private String id; + @ApiModelProperty("名称") + private String name; + @ApiModelProperty("节点父ID") + private String creator; + + +} diff --git a/backend/src/main/java/io/dataease/job/sechedule/DeScheduleJob.java b/backend/src/main/java/io/dataease/job/sechedule/DeScheduleJob.java index 8400020daa..3fa52a44d3 100644 --- a/backend/src/main/java/io/dataease/job/sechedule/DeScheduleJob.java +++ b/backend/src/main/java/io/dataease/job/sechedule/DeScheduleJob.java @@ -8,6 +8,7 @@ public abstract class DeScheduleJob implements Job { protected String datasetTableId; protected String expression; protected String taskId; + protected String updateType; @Override public void execute(JobExecutionContext context) throws JobExecutionException { @@ -16,6 +17,7 @@ public abstract class DeScheduleJob implements Job { this.datasetTableId = jobDataMap.getString("datasetTableId"); this.expression = jobDataMap.getString("expression"); this.taskId = jobDataMap.getString("taskId"); + this.updateType = jobDataMap.getString("updateType"); LogUtil.info(jobKey.getGroup() + " Running: " + datasetTableId); LogUtil.info("CronExpression: " + expression); diff --git a/backend/src/main/java/io/dataease/job/sechedule/ExtractDataJob.java b/backend/src/main/java/io/dataease/job/sechedule/ExtractDataJob.java index 2704f33a02..ec91fbdce7 100644 --- a/backend/src/main/java/io/dataease/job/sechedule/ExtractDataJob.java +++ b/backend/src/main/java/io/dataease/job/sechedule/ExtractDataJob.java @@ -16,7 +16,7 @@ public class ExtractDataJob extends DeScheduleJob{ @Override void businessExecute(JobExecutionContext context) { - extractDataService.extractData(datasetTableId, taskId); + extractDataService.extractData(datasetTableId, taskId, updateType); } } diff --git a/backend/src/main/java/io/dataease/job/sechedule/ScheduleManager.java b/backend/src/main/java/io/dataease/job/sechedule/ScheduleManager.java index 44bdf3aaad..53a2c4852d 100644 --- a/backend/src/main/java/io/dataease/job/sechedule/ScheduleManager.java +++ b/backend/src/main/java/io/dataease/job/sechedule/ScheduleManager.java @@ -369,11 +369,12 @@ public class ScheduleManager { addOrUpdateCronJob(jobKey, triggerKey, jobClass, cron, startTime, endTime, null); } - public JobDataMap getDefaultJobDataMap(String resourceId, String expression, String taskId) { + public JobDataMap getDefaultJobDataMap(String resourceId, String expression, String taskId, String updateType) { JobDataMap jobDataMap = new JobDataMap(); jobDataMap.put("datasetTableId", resourceId); jobDataMap.put("taskId", taskId); jobDataMap.put("expression", expression); + jobDataMap.put("updateType", updateType); return jobDataMap; } diff --git a/backend/src/main/java/io/dataease/notice/service/NoticeService.java b/backend/src/main/java/io/dataease/notice/service/NoticeService.java index 3b5278e2f0..10c2fc483a 100644 --- a/backend/src/main/java/io/dataease/notice/service/NoticeService.java +++ b/backend/src/main/java/io/dataease/notice/service/NoticeService.java @@ -1,5 +1,6 @@ package io.dataease.notice.service; +import io.dataease.auth.api.dto.CurrentUserDto; import io.dataease.base.domain.MessageTask; import io.dataease.base.domain.MessageTaskExample; import io.dataease.base.domain.SysUser; @@ -101,7 +102,7 @@ public class NoticeService { } public List searchMessageByType(String type) { - SysUser user = AuthUtils.getUser(); + CurrentUserDto user = AuthUtils.getUser(); //String orgId = user.getLastOrganizationId(); List messageDetails = new ArrayList<>(); diff --git a/backend/src/main/java/io/dataease/service/ScheduleService.java b/backend/src/main/java/io/dataease/service/ScheduleService.java index 5885687dcb..8aa4e85735 100644 --- a/backend/src/main/java/io/dataease/service/ScheduleService.java +++ b/backend/src/main/java/io/dataease/service/ScheduleService.java @@ -1,6 +1,7 @@ package io.dataease.service; import io.dataease.base.domain.DatasetTableTask; +import io.dataease.commons.constants.ScheduleType; import io.dataease.job.sechedule.ExtractDataJob; import io.dataease.job.sechedule.ScheduleManager; import org.apache.commons.lang3.StringUtils; @@ -21,12 +22,13 @@ public class ScheduleService { private ScheduleManager scheduleManager; public void addSchedule(DatasetTableTask datasetTableTask) throws Exception { - if (StringUtils.equalsIgnoreCase(datasetTableTask.getRate(), "0")) { + if (StringUtils.equalsIgnoreCase(datasetTableTask.getRate(), ScheduleType.SIMPLE.toString())) { scheduleManager.addOrUpdateSingleJob(new JobKey(datasetTableTask.getId(), datasetTableTask.getTableId()), new TriggerKey(datasetTableTask.getId(), datasetTableTask.getTableId()), ExtractDataJob.class, - new Date(datasetTableTask.getStartTime()), scheduleManager.getDefaultJobDataMap(datasetTableTask.getTableId(), datasetTableTask.getCron(), datasetTableTask.getId())); - } else if (StringUtils.equalsIgnoreCase(datasetTableTask.getRate(), "1")) { + new Date(datasetTableTask.getStartTime()), + scheduleManager.getDefaultJobDataMap(datasetTableTask.getTableId(), datasetTableTask.getCron(), datasetTableTask.getId(), datasetTableTask.getType())); + } else if (StringUtils.equalsIgnoreCase(datasetTableTask.getRate(), ScheduleType.CRON.toString())) { Date endTime; if (datasetTableTask.getEndTime() == null || datasetTableTask.getEndTime() == 0) { endTime = null; @@ -38,7 +40,7 @@ public class ScheduleService { new TriggerKey(datasetTableTask.getId(), datasetTableTask.getTableId()), ExtractDataJob.class, datasetTableTask.getCron(), new Date(datasetTableTask.getStartTime()), endTime, - scheduleManager.getDefaultJobDataMap(datasetTableTask.getTableId(), datasetTableTask.getCron(), datasetTableTask.getId())); + scheduleManager.getDefaultJobDataMap(datasetTableTask.getTableId(), datasetTableTask.getCron(), datasetTableTask.getId(), datasetTableTask.getType())); } } diff --git a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java index eb7e2576d4..01640780c9 100644 --- a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java +++ b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java @@ -2,10 +2,8 @@ package io.dataease.service.dataset; import com.google.gson.Gson; -import io.dataease.base.domain.DatasetTable; -import io.dataease.base.domain.DatasetTableExample; -import io.dataease.base.domain.DatasetTableField; -import io.dataease.base.domain.Datasource; +import io.dataease.base.domain.*; +import io.dataease.base.mapper.DatasetTableIncrementalConfigMapper; import io.dataease.base.mapper.DatasetTableMapper; import io.dataease.base.mapper.DatasourceMapper; import io.dataease.commons.utils.BeanUtils; @@ -40,6 +38,8 @@ public class DataSetTableService { private DataSetTableFieldsService dataSetTableFieldsService; @Resource private DataSetTableTaskService dataSetTableTaskService; + @Resource + private DatasetTableIncrementalConfigMapper datasetTableIncrementalConfigMapper; public void batchInsert(List datasetTable) throws Exception { for (DatasetTable table : datasetTable) { @@ -261,6 +261,20 @@ public class DataSetTableService { return data; } + public List getDataSetDataBySql(String datasourceId, String table, String sql) { + List data = new ArrayList<>(); + Datasource ds = datasourceMapper.selectByPrimaryKey(datasourceId); + DatasourceProvider datasourceProvider = ProviderFactory.getProvider(ds.getType()); + DatasourceRequest datasourceRequest = new DatasourceRequest(); + datasourceRequest.setDatasource(ds); + datasourceRequest.setQuery(sql); + try { + return datasourceProvider.getData(datasourceRequest); + } catch (Exception e) { + } + return data; + } + public void saveTableField(DatasetTable datasetTable) throws Exception { Datasource ds = datasourceMapper.selectByPrimaryKey(datasetTable.getDataSourceId()); DataSetTableRequest dataSetTableRequest = new DataSetTableRequest(); @@ -349,4 +363,35 @@ public class DataSetTableService { return 0; } } + + public DatasetTableIncrementalConfig incrementalConfig(DatasetTableIncrementalConfig datasetTableIncrementalConfig){ + if(StringUtils.isEmpty(datasetTableIncrementalConfig.getTableId())){return new DatasetTableIncrementalConfig();} + DatasetTableIncrementalConfigExample example = new DatasetTableIncrementalConfigExample(); + example.createCriteria().andTableIdEqualTo(datasetTableIncrementalConfig.getTableId()); + List configs = datasetTableIncrementalConfigMapper.selectByExample(example); + if(CollectionUtils.isNotEmpty(configs)){ + return configs.get(0); + }else { + return new DatasetTableIncrementalConfig(); + } + } + + public DatasetTableIncrementalConfig incrementalConfig(String datasetTableId){ + DatasetTableIncrementalConfig datasetTableIncrementalConfig = new DatasetTableIncrementalConfig(); + datasetTableIncrementalConfig.setTableId(datasetTableId); + return incrementalConfig(datasetTableIncrementalConfig); + } + + + public void saveIncrementalConfig(DatasetTableIncrementalConfig datasetTableIncrementalConfig){ + if(StringUtils.isEmpty(datasetTableIncrementalConfig.getId())){ + datasetTableIncrementalConfig.setId(UUID.randomUUID().toString()); + datasetTableIncrementalConfigMapper.insertSelective(datasetTableIncrementalConfig); + }else{ + DatasetTableIncrementalConfigExample example = new DatasetTableIncrementalConfigExample(); + example.createCriteria().andTableIdEqualTo(datasetTableIncrementalConfig.getTableId()); + datasetTableIncrementalConfigMapper.updateByExample(datasetTableIncrementalConfig, example); + } + } + } diff --git a/backend/src/main/java/io/dataease/service/dataset/DataSetTableTaskService.java b/backend/src/main/java/io/dataease/service/dataset/DataSetTableTaskService.java index ba494c375a..5640cd3020 100644 --- a/backend/src/main/java/io/dataease/service/dataset/DataSetTableTaskService.java +++ b/backend/src/main/java/io/dataease/service/dataset/DataSetTableTaskService.java @@ -70,6 +70,10 @@ public class DataSetTableTaskService { return datasetTableTaskMapper.selectByPrimaryKey(id); } + public void update(DatasetTableTask datasetTableTask) { + datasetTableTaskMapper.updateByPrimaryKey(datasetTableTask); + } + public List list(DatasetTableTask datasetTableTask) { DatasetTableTaskExample datasetTableTaskExample = new DatasetTableTaskExample(); DatasetTableTaskExample.Criteria criteria = datasetTableTaskExample.createCriteria(); diff --git a/backend/src/main/java/io/dataease/service/dataset/ExtractDataService.java b/backend/src/main/java/io/dataease/service/dataset/ExtractDataService.java index 248d98f497..7078f03f5f 100644 --- a/backend/src/main/java/io/dataease/service/dataset/ExtractDataService.java +++ b/backend/src/main/java/io/dataease/service/dataset/ExtractDataService.java @@ -1,19 +1,23 @@ package io.dataease.service.dataset; import com.google.gson.Gson; -import io.dataease.base.domain.DatasetTable; -import io.dataease.base.domain.DatasetTableField; -import io.dataease.base.domain.DatasetTableTaskLog; +import io.dataease.base.domain.*; import io.dataease.commons.constants.JobStatus; +import io.dataease.commons.constants.ScheduleType; +import io.dataease.commons.constants.UpdateType; import io.dataease.commons.utils.CommonBeanFactory; import io.dataease.commons.utils.LogUtil; +import io.dataease.dto.dataset.DataSetTaskLogDTO; import io.dataease.dto.dataset.DataTableInfoDTO; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.*; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.security.MessageDigest; import java.util.List; import java.util.UUID; import java.util.concurrent.ExecutorService; @@ -28,54 +32,74 @@ public class ExtractDataService { private DataSetTableFieldsService dataSetTableFieldsService; @Resource private DataSetTableTaskLogService dataSetTableTaskLogService; + @Resource + private DataSetTableTaskService dataSetTableTaskService; private Long pageSize = 10000l; private static ExecutorService pool = Executors.newScheduledThreadPool(50); //设置连接池 private Connection connection; + private static String lastUpdateTime = "${__last_update_time__}"; + private static String currentUpdateTime = "${__current_update_time__}"; + private static String column_family = "dataease"; - public void extractData(String datasetTableId, String taskId) { + public void extractData(String datasetTableId, String taskId, String type) { DatasetTableTaskLog datasetTableTaskLog = new DatasetTableTaskLog(); + UpdateType updateType = UpdateType.valueOf(type); try { - datasetTableTaskLog.setTableId(datasetTableId); - datasetTableTaskLog.setTaskId(taskId); - datasetTableTaskLog.setStatus(JobStatus.Underway.name()); - datasetTableTaskLog.setStartTime(System.currentTimeMillis()); - dataSetTableTaskLogService.save(datasetTableTaskLog); Admin admin = getConnection().getAdmin(); DatasetTable datasetTable = dataSetTableService.get(datasetTableId); List datasetTableFields = dataSetTableFieldsService.list(DatasetTableField.builder().tableId(datasetTable.getId()).build()); String table = new Gson().fromJson(datasetTable.getInfo(), DataTableInfoDTO.class).getTable(); TableName tableName = TableName.valueOf(table + "-" + datasetTable.getDataSourceId()); - if(!admin.tableExists(tableName)){ - TableDescriptorBuilder descBuilder = TableDescriptorBuilder.newBuilder(tableName); - ColumnFamilyDescriptor hcd = ColumnFamilyDescriptorBuilder.of("cf"); - descBuilder.setColumnFamily(hcd); - TableDescriptor desc = descBuilder.build(); - admin.createTable(desc); - } - admin.disableTable(tableName); - admin.truncateTable(tableName, true); - - Table tab = getConnection().getTable(tableName); - Long total = dataSetTableService.getDataSetTotalData(datasetTable.getDataSourceId(), table); - Long pageCount = total % pageSize == 0 ? total / pageSize : (total / pageSize) + 1; - - for (Long pageIndex = 1l; pageIndex <= pageCount; pageIndex++) { - List data = dataSetTableService.getDataSetPageData(datasetTable.getDataSourceId(), table, datasetTableFields, pageIndex, pageSize); - for (String[] d : data) { - for(int i=0;i dataSetTaskLogDTOS = dataSetTableTaskLogService.list(request); + if(CollectionUtils.isEmpty(dataSetTaskLogDTOS)){ + return; + } + writeDatasetTableTaskLog(datasetTableTaskLog,datasetTableId, taskId); + + // 增量添加 + if(StringUtils.isNotEmpty(datasetTableIncrementalConfig.getIncrementalAdd())){ + String sql = datasetTableIncrementalConfig.getIncrementalAdd().replace(lastUpdateTime, dataSetTaskLogDTOS.get(0).getStartTime().toString() + .replace(currentUpdateTime, Long.valueOf(System.currentTimeMillis()).toString())); + extractIncrementalData(tableName,table,datasetTable, datasetTableFields, sql, "add"); + } + + // 增量删除 + if( StringUtils.isNotEmpty(datasetTableIncrementalConfig.getIncrementalDelete())){ + String sql = datasetTableIncrementalConfig.getIncrementalDelete().replace(lastUpdateTime, dataSetTaskLogDTOS.get(0).getStartTime().toString() + .replace(currentUpdateTime, Long.valueOf(System.currentTimeMillis()).toString())); + extractIncrementalData(tableName,table,datasetTable, datasetTableFields, sql, "delete"); + } + + datasetTableTaskLog.setStatus(JobStatus.Completed.name()); + datasetTableTaskLog.setEndTime(System.currentTimeMillis()); + dataSetTableTaskLogService.save(datasetTableTaskLog); + break; } - datasetTableTaskLog.setStatus(JobStatus.Completed.name()); - datasetTableTaskLog.setEndTime(System.currentTimeMillis()); - dataSetTableTaskLogService.save(datasetTableTaskLog); }catch (Exception e){ e.printStackTrace(); LogUtil.error("ExtractData error, dataaset: " + datasetTableId); @@ -84,8 +108,75 @@ public class ExtractDataService { datasetTableTaskLog.setEndTime(System.currentTimeMillis()); dataSetTableTaskLogService.save(datasetTableTaskLog); } + finally { + DatasetTableTask datasetTableTask = dataSetTableTaskService.get(taskId); + if (datasetTableTask != null && datasetTableTask.getRate().equalsIgnoreCase(ScheduleType.SIMPLE.toString())){ + datasetTableTask.setRate(ScheduleType.SIMPLE_COMPLETE.toString()); + dataSetTableTaskService.update(datasetTableTask); + } + } } + private void writeDatasetTableTaskLog(DatasetTableTaskLog datasetTableTaskLog, String datasetTableId, String taskId){ + datasetTableTaskLog.setTableId(datasetTableId); + datasetTableTaskLog.setTaskId(taskId); + datasetTableTaskLog.setStatus(JobStatus.Underway.name()); + datasetTableTaskLog.setStartTime(System.currentTimeMillis()); + dataSetTableTaskLogService.save(datasetTableTaskLog); + } + + private void creatHaseTable(TableName tableName, Admin admin)throws Exception{ + TableDescriptorBuilder descBuilder = TableDescriptorBuilder.newBuilder(tableName); + ColumnFamilyDescriptor hcd = ColumnFamilyDescriptorBuilder.of(column_family); + descBuilder.setColumnFamily(hcd); + TableDescriptor desc = descBuilder.build(); + admin.createTable(desc); + } + + private void extractAllData(Admin admin, TableName tableName, String table, DatasetTable datasetTable, List datasetTableFields)throws Exception{ + admin.disableTable(tableName); + admin.truncateTable(tableName, true); + + Table tab = getConnection().getTable(tableName); + Long total = dataSetTableService.getDataSetTotalData(datasetTable.getDataSourceId(), table); + Long pageCount = total % pageSize == 0 ? total / pageSize : (total / pageSize) + 1; + + for (Long pageIndex = 1l; pageIndex <= pageCount; pageIndex++) { + List data = dataSetTableService.getDataSetPageData(datasetTable.getDataSourceId(), table, datasetTableFields, pageIndex, pageSize); + insertDataToHbaseTable(data,datasetTableFields,tab); + } + } + + private void extractIncrementalData(TableName tableName, String table, DatasetTable datasetTable, List datasetTableFields, String sql, String type)throws Exception{ + Table tab = getConnection().getTable(tableName); + List data = dataSetTableService.getDataSetDataBySql(datasetTable.getDataSourceId(), table, sql); + if (type.equalsIgnoreCase("add")){ + insertDataToHbaseTable(data,datasetTableFields,tab); + }else { + deleteDataFromHbaseTable(data,datasetTableFields,tab); + } + } + + private void insertDataToHbaseTable(List data, List datasetTableFields, Table tab)throws Exception{ + for (String[] d : data) { + Put put = new Put(md5(generateStr(datasetTableFields.size(), d)).getBytes()); + for(int i=0;i data, List datasetTableFields, Table tab)throws Exception{ + for (String[] d : data) { + Delete delete = new Delete(md5(generateStr(datasetTableFields.size(), d)).getBytes()); + tab.delete(delete); + } + } private synchronized Connection getConnection() throws Exception{ if(connection == null || connection.isClosed()){ @@ -94,4 +185,43 @@ public class ExtractDataService { } return connection; } + + + private static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; + private static final String UTF_8 = "UTF-8"; + + public static String md5(String src) { + return md5(src, UTF_8); + } + + public static String md5(String src, String charset) { + try { + byte[] strTemp = io.micrometer.core.instrument.util.StringUtils.isEmpty(charset) ? src.getBytes() : src.getBytes(charset); + MessageDigest mdTemp = MessageDigest.getInstance("MD5"); + mdTemp.update(strTemp); + + byte[] md = mdTemp.digest(); + int j = md.length; + char[] str = new char[j * 2]; + int k = 0; + + for (byte byte0 : md) { + str[k++] = HEX_DIGITS[byte0 >>> 4 & 0xf]; + str[k++] = HEX_DIGITS[byte0 & 0xf]; + } + + return new String(str); + } catch (Exception e) { + throw new RuntimeException("MD5 encrypt error:", e); + } + } + + public String generateStr(int size, String[] d ){ + String str = null; + for(int i=0;i panelIds = request.getPanelIds(); - List userIds = request.getUserIds(); + List targetIds = request.getTargetIds(); // 使用原生对象会导致事物失效 所以这里需要使用spring代理对象 if (CollectionUtils.isNotEmpty(panelIds)){ ShareService proxy = CommonBeanFactory.getBean(ShareService.class); - panelIds.forEach(proxy::delete); + panelIds.forEach(panelId -> { + proxy.delete(panelId, type); + }); } - if (CollectionUtils.isEmpty(userIds)) return; + if (CollectionUtils.isEmpty(targetIds)) return; + long now = System.currentTimeMillis(); List shares = panelIds.stream().flatMap(panelId -> - userIds.stream().map(userId -> { + targetIds.stream().map(targetId -> { PanelShare share = new PanelShare(); share.setCreateTime(now); share.setPanelGroupId(panelId); - share.setUserId(userId); + share.setTargetId(targetId); + share.setType(type); return share; }) ).collect(Collectors.toList()); @@ -64,30 +74,51 @@ public class ShareService { * @param panel_group_id */ @Transactional - public void delete(String panel_group_id){ + public void delete(String panel_group_id, Integer type){ PanelShareExample example = new PanelShareExample(); - example.createCriteria().andPanelGroupIdEqualTo(panel_group_id); + example.createCriteria().andPanelGroupIdEqualTo(panel_group_id).andTypeEqualTo(type); mapper.deleteByExample(example); } public List queryTree(BaseGridRequest request){ - Long userId = AuthUtils.getUser().getUserId(); + CurrentUserDto user = AuthUtils.getUser(); + Long userId = user.getUserId(); + Long deptId = user.getDeptId(); + List roleIds = user.getRoles().stream().map(CurrentRoleDto::getId).collect(Collectors.toList()); + + List targetIds = new ArrayList<>(); + targetIds.add(userId); + targetIds.add(deptId); + targetIds.addAll(roleIds); + ConditionEntity condition = new ConditionEntity(); - condition.setField("s.user_id"); - condition.setOperator("eq"); - condition.setValue(userId); + condition.setField("s.target_id"); + condition.setOperator("in"); + condition.setValue(targetIds); + request.setConditions(new ArrayList(){{add(condition);}}); + GridExample example = request.convertExample(); - List datas = extPanelShareMapper.query(example); - return convertTree(datas); + List datas = extPanelShareMapper.query(example); + List dtoLists = datas.stream().map(po -> BeanUtils.copyBean(new PanelShareDto(), po)).collect(Collectors.toList()); + return convertTree(dtoLists); } //List构建Tree private List convertTree(List datas){ Map> map = datas.stream().collect(Collectors.groupingBy(PanelShareDto::getCreator)); - List roots = new ArrayList<>(); - return map.entrySet().stream().map(entry -> PanelShareDto.builder().name(entry.getKey()).children(entry.getValue()).build()).collect(Collectors.toList()); + return map.entrySet().stream().map(entry -> { + PanelShareDto panelShareDto = new PanelShareDto(); + panelShareDto.setName(entry.getKey()); + panelShareDto.setChildren(entry.getValue()); + return panelShareDto; + }).collect(Collectors.toList()); + } + + public List queryWithResource(BaseGridRequest request){ + GridExample example = request.convertExample(); + return extPanelShareMapper.queryWithResource(example); } diff --git a/backend/src/main/java/io/dataease/service/sys/DeptService.java b/backend/src/main/java/io/dataease/service/sys/DeptService.java index d33adcd36e..a3c74199ea 100644 --- a/backend/src/main/java/io/dataease/service/sys/DeptService.java +++ b/backend/src/main/java/io/dataease/service/sys/DeptService.java @@ -14,6 +14,7 @@ import io.dataease.controller.sys.request.DeptDeleteRequest; import io.dataease.controller.sys.request.DeptStatusRequest; import io.dataease.controller.sys.request.SimpleTreeNode; import io.dataease.controller.sys.response.DeptTreeNode; +import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -134,8 +135,10 @@ public class DeptService { List targetNodes = nodeByCondition(request); List ids = upTree(allNodes, targetNodes); SysDeptExample example = new SysDeptExample(); - SysDeptExample.Criteria criteria = example.createCriteria(); - criteria.andDeptIdIn(ids); + if (CollectionUtils.isNotEmpty(ids)){ + SysDeptExample.Criteria criteria = example.createCriteria(); + criteria.andDeptIdIn(ids); + } example.setOrderByClause("dept_sort"); List sysDepts = sysDeptMapper.selectByExample(example); return sysDepts; diff --git a/backend/src/main/java/io/dataease/service/sys/SysUserService.java b/backend/src/main/java/io/dataease/service/sys/SysUserService.java index f36e23c859..85ccfc0ef2 100644 --- a/backend/src/main/java/io/dataease/service/sys/SysUserService.java +++ b/backend/src/main/java/io/dataease/service/sys/SysUserService.java @@ -8,6 +8,7 @@ import io.dataease.base.mapper.SysUserMapper; import io.dataease.base.mapper.SysUsersRolesMapper; import io.dataease.base.mapper.ext.ExtSysUserMapper; import io.dataease.base.mapper.ext.query.GridExample; +import io.dataease.commons.constants.AuthConstants; import io.dataease.commons.utils.BeanUtils; import io.dataease.commons.utils.CodingUtil; import io.dataease.controller.sys.base.BaseGridRequest; @@ -30,7 +31,6 @@ import java.util.stream.Collectors; @Service public class SysUserService { - private final static String USER_CACHE_NAME = "users_info"; private final static String DEFAULT_PWD = "DataEase123.."; @Resource @@ -72,6 +72,12 @@ public class SysUserService { return insert; } + /** + * 修改用户密码清楚缓存 + * @param request + * @return + */ + @CacheEvict(value = AuthConstants.USER_CACHE_NAME, key = "'user' + #request.userId") @Transactional public int update(SysUserCreateRequest request){ SysUser user = BeanUtils.copyBean(new SysUser(), request); @@ -95,7 +101,7 @@ public class SysUserService { * @param request * @return */ - @CacheEvict(value = USER_CACHE_NAME, key = "'user' + #request.userId") + @CacheEvict(value = AuthConstants.USER_CACHE_NAME, key = "'user' + #request.userId") public int updatePwd(SysUserPwdRequest request) { if (!StringUtils.equals(request.getPassword(), request.getRepeatPassword())){ throw new RuntimeException("两次密码不一致"); @@ -115,7 +121,7 @@ public class SysUserService { return sysUserMapper.updateByPrimaryKeySelective(sysUser); } - @CacheEvict(value = USER_CACHE_NAME, key = "'user' + #request.userId") + @CacheEvict(value = AuthConstants.USER_CACHE_NAME, key = "'user' + #request.userId") public int adminUpdatePwd(SysUserPwdRequest request){ SysUser sysUser = new SysUser(); sysUser.setUserId(request.getUserId()); @@ -150,7 +156,7 @@ public class SysUserService { }); } - @CacheEvict(value = USER_CACHE_NAME, key = "'user' + #userId") + @CacheEvict(value = AuthConstants.USER_CACHE_NAME, key = "'user' + #userId") @Transactional public int delete(Long userId){ deleteUserRoles(userId); diff --git a/backend/src/main/resources/application.properties b/backend/src/main/resources/application.properties index 82cdf1f357..8b7d88331d 100644 --- a/backend/src/main/resources/application.properties +++ b/backend/src/main/resources/application.properties @@ -58,6 +58,8 @@ spring.cache.ehcache.config=classpath:/ehcache/ehcache.xml logging.level.org.springframework.web=trace logging.level.org.springframework.boot.web=trace spring.mvc.log-request-details=true +pagehelper.PageRowBounds=true + diff --git a/backend/src/main/resources/db/migration/V12__panel_table.sql b/backend/src/main/resources/db/migration/V12__panel_table.sql index 0a4fea5f3c..b3a0802f76 100644 --- a/backend/src/main/resources/db/migration/V12__panel_table.sql +++ b/backend/src/main/resources/db/migration/V12__panel_table.sql @@ -67,7 +67,7 @@ CREATE TABLE `panel_store` ( `user_id` bigint(20) NOT NULL COMMENT '用户ID', `create_time` bigint(13) DEFAULT NULL COMMENT '创建日期', PRIMARY KEY (`store_id`) USING BTREE, - UNIQUE KEY `UK_store_user_id` (`user_id`) USING BTREE + KEY `UK_store_user_id` (`user_id`) ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='仪表板收藏'; @@ -86,11 +86,14 @@ DROP TABLE IF EXISTS `panel_share`; CREATE TABLE `panel_share` ( `share_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '分享ID', `panel_group_id` varchar(50) DEFAULT NULL COMMENT '仪表板ID', - `user_id` bigint(20) DEFAULT NULL COMMENT '用户ID', + `target_id` bigint(20) DEFAULT NULL COMMENT '目标ID', `create_time` bigint(13) DEFAULT NULL COMMENT '创建日期', + `type` int(8) DEFAULT NULL COMMENT '类型0:user,1:role,2dept', PRIMARY KEY (`share_id`) USING BTREE, - UNIQUE KEY `UK_share_user_id` (`user_id`) USING BTREE, - UNIQUE KEY `UK_share_panel_group_id` (`panel_group_id`) USING BTREE + KEY `UK_share_arget_id` (`target_id`) , + KEY `UK_share_panel_group_id` (`panel_group_id`) , + KEY `UK_share_type` (`type`) + ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='仪表板分享'; diff --git a/backend/src/main/resources/db/migration/V13__dataset_tables_incre.sql b/backend/src/main/resources/db/migration/V13__dataset_tables_incre.sql new file mode 100644 index 0000000000..33ad3a0038 --- /dev/null +++ b/backend/src/main/resources/db/migration/V13__dataset_tables_incre.sql @@ -0,0 +1,10 @@ +DROP TABLE IF EXISTS `dataset_table_incremental_config`; +CREATE TABLE IF NOT EXISTS `dataset_table_incremental_config` +( + `id` varchar(50) NOT NULL COMMENT 'ID', + `table_id` varchar(50) NOT NULL COMMENT '表ID', + `incremental_delete` longtext COMMENT '详细信息', + `incremental_add` longtext COMMENT '详细信息', + PRIMARY KEY (`id`) +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4; \ No newline at end of file diff --git a/backend/src/main/resources/ehcache/ehcache.xml b/backend/src/main/resources/ehcache/ehcache.xml index a5e5d7b09a..ff551ec033 100644 --- a/backend/src/main/resources/ehcache/ehcache.xml +++ b/backend/src/main/resources/ehcache/ehcache.xml @@ -46,6 +46,28 @@ timeToLiveSeconds="3600" memoryStoreEvictionPolicy="LRU" /> + + - - - + + + + @@ -64,8 +64,13 @@ - - +
+ + + + + +
diff --git a/frontend/src/api/panel/share.js b/frontend/src/api/panel/share.js new file mode 100644 index 0000000000..d463ea3b99 --- /dev/null +++ b/frontend/src/api/panel/share.js @@ -0,0 +1,29 @@ +import request from '@/utils/request' + +export function saveShare(data) { + return request({ + url: '/api/share/', + method: 'post', + loading: true, + data + }) +} + +export function loadShares(data) { + return request({ + url: '/api/share/queryWithResourceId', + method: 'post', + loading: true, + data + }) +} + +export function loadTree(data) { + return request({ + url: '/api/share/treeList', + method: 'post', + loading: true, + data + }) +} + diff --git a/frontend/src/components/vue-drag-resize-rotate/index.vue b/frontend/src/components/vue-drag-resize-rotate/index.vue index 5d64565b9e..766e1fc8cd 100644 --- a/frontend/src/components/vue-drag-resize-rotate/index.vue +++ b/frontend/src/components/vue-drag-resize-rotate/index.vue @@ -312,8 +312,6 @@ export default { data: function() { return { - styleInit:true, - styleCatch:{}, left: this.x, top: this.y, right: null, diff --git a/frontend/src/icons/svg/bar-horizontal.svg b/frontend/src/icons/svg/bar-horizontal.svg new file mode 100644 index 0000000000..6ade56b3c8 --- /dev/null +++ b/frontend/src/icons/svg/bar-horizontal.svg @@ -0,0 +1 @@ + diff --git a/frontend/src/icons/svg/bar-stack-horizontal.svg b/frontend/src/icons/svg/bar-stack-horizontal.svg new file mode 100644 index 0000000000..9a78910ab6 --- /dev/null +++ b/frontend/src/icons/svg/bar-stack-horizontal.svg @@ -0,0 +1 @@ + diff --git a/frontend/src/icons/svg/bar-stack.svg b/frontend/src/icons/svg/bar-stack.svg new file mode 100644 index 0000000000..90beda11f0 --- /dev/null +++ b/frontend/src/icons/svg/bar-stack.svg @@ -0,0 +1 @@ + diff --git a/frontend/src/icons/svg/bar.svg b/frontend/src/icons/svg/bar.svg new file mode 100644 index 0000000000..2136e79aad --- /dev/null +++ b/frontend/src/icons/svg/bar.svg @@ -0,0 +1 @@ + diff --git a/frontend/src/icons/svg/funnel.svg b/frontend/src/icons/svg/funnel.svg new file mode 100644 index 0000000000..89190945f5 --- /dev/null +++ b/frontend/src/icons/svg/funnel.svg @@ -0,0 +1 @@ + diff --git a/frontend/src/icons/svg/line.svg b/frontend/src/icons/svg/line.svg new file mode 100644 index 0000000000..c72c676e2b --- /dev/null +++ b/frontend/src/icons/svg/line.svg @@ -0,0 +1 @@ + diff --git a/frontend/src/icons/svg/pie.svg b/frontend/src/icons/svg/pie.svg new file mode 100644 index 0000000000..7d7c52824e --- /dev/null +++ b/frontend/src/icons/svg/pie.svg @@ -0,0 +1 @@ + diff --git a/frontend/src/lang/zh.js b/frontend/src/lang/zh.js index 46ef617959..cb75360565 100644 --- a/frontend/src/lang/zh.js +++ b/frontend/src/lang/zh.js @@ -614,7 +614,30 @@ export default { color_gentle: '柔和', color_elegant: '淡雅', color_technology: '科技', - color_simple: '简洁' + color_simple: '简洁', + not_alpha: '不透明度', + size: '大小', + bar_width: '柱宽', + bar_gap: '柱间隔', + adapt: '自适应', + line_width: '线宽', + line_type: '线型', + line_symbol: '折点', + line_symbol_size: '折点大小', + line_type_solid: '实线', + line_type_dashed: '虚线', + line_symbol_circle: '圆形', + line_symbol_emptyCircle: '空心圆', + line_symbol_rect: '矩形', + line_symbol_roundRect: '圆角矩形', + line_symbol_triangle: '三角形', + line_symbol_diamond: '菱形', + line_symbol_pin: '钉子', + line_symbol_arrow: '箭头', + line_symbol_none: '无', + pie_inner_radius: '内径', + pie_outer_radius: '外径', + funnel_width: '宽度' }, dataset: { datalist: '数据集', @@ -683,7 +706,12 @@ export default { add_sql_table: '添加SQL', preview: '预览', pls_input_name: '请输入名称', - connect_mode: '连接模式' + connect_mode: '连接模式', + incremental_update_type: '增量更新方式:', + incremental_add: '增量添加:', + incremental_delete: '增量删除:', + last_update_time: '上次更新时间:', + current_update_time: '当前更新时间:' }, datasource: { create: '新建数据连接', @@ -701,6 +729,7 @@ export default { please_input_port: '请输入端口', modify: '编辑数据连接', validate_success: '校验成功', + validate: '校验', delete: '删除组织', delete_confirm: '删除该组织会关联删除该组织下的所有资源(如:相关工作空间,项目,测试用例等),确定要删除吗?', input_name: '请输入名称', diff --git a/frontend/src/main.js b/frontend/src/main.js index ae4d9aa02d..4d7f648a55 100644 --- a/frontend/src/main.js +++ b/frontend/src/main.js @@ -8,15 +8,13 @@ import i18n from './lang' // internationalization import App from './App' import store from './store' import router from './router' - +import message from './utils/message' import '@/icons' // icon import '@/permission' // permission control import api from '@/api/index.js' import filter from '@/filter/filter' import directives from './directive' -import './styles/vdrr/common-temp.scss' - import vdrr from './components/vue-drag-resize-rotate' Vue.component('vdrr', vdrr) @@ -27,7 +25,7 @@ import * as echarts from 'echarts' Vue.prototype.$echarts = echarts import UmyUi from 'umy-ui' -import 'umy-ui/lib/theme-chalk/index.css'// 引入样式 + Vue.use(UmyUi) // 引入vue-UUID组件 @@ -59,6 +57,7 @@ Vue.use(Fit2CloudUI, { }) Vue.use(filter) Vue.use(directives) +Vue.use(message) Vue.config.productionTip = false new Vue({ diff --git a/frontend/src/styles/index.scss b/frontend/src/styles/index.scss index c8f6acbde9..eadcbd344f 100644 --- a/frontend/src/styles/index.scss +++ b/frontend/src/styles/index.scss @@ -6,6 +6,8 @@ @import './sidebar.scss'; @import './topbar.scss'; @import "~fit2cloud-ui/src/styles/index.scss"; +@import './vdrr/common-temp.scss'; +@import '~umy-ui/lib/theme-chalk/index.css';// 引入样式 // @import '../metersphere/common/css/index.css'; @@ -69,3 +71,42 @@ div:focus { .app-container { padding: 20px; } + +.de-dialog { + width: 30% !important; + + .el-dialog__header{ + background-color: #f4f4f5; + padding: 10px 20px !important; + } + .el-dialog__body{ + padding: 1px 20px !important; + + } +} + +.de-search-header { + .el-tabs__header{ + display: none !important;; + } +} + +.de-input{ + margin-bottom: 14px; + margin-top: 10px; + .el-input{ + .el-input__inner { + line-height: 30px !important; + height: 30px !important; + border-right: none; + + } + } + .el-input__inner:focus{ + border-color: #E6E6E6 !important; + } + .el-input-group__append { + background-color: #ffffff; + } + +} diff --git a/frontend/src/utils/request.js b/frontend/src/utils/request.js index 7232afaea8..408bee2102 100644 --- a/frontend/src/utils/request.js +++ b/frontend/src/utils/request.js @@ -14,7 +14,7 @@ const RefreshTokenKey = Config.RefreshTokenKey const service = axios.create({ baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url // withCredentials: true, // send cookies when cross-domain requests - timeout: 5000 // request timeout + timeout: 0 // request timeout }) // request interceptor diff --git a/frontend/src/views/chart/chart/bar/bar.js b/frontend/src/views/chart/chart/bar/bar.js new file mode 100644 index 0000000000..0b6f8185af --- /dev/null +++ b/frontend/src/views/chart/chart/bar/bar.js @@ -0,0 +1,103 @@ +import { hexColorToRGBA } from '../util.js' + +export function baseBarOption(chart_option, chart) { + // 处理shape attr + let customAttr = {} + if (chart.customAttr) { + customAttr = JSON.parse(chart.customAttr) + if (customAttr.color) { + chart_option.color = customAttr.color.colors + } + } + // 处理data + if (chart.data) { + chart_option.title.text = chart.title + chart_option.xAxis.data = chart.data.x + for (let i = 0; i < chart.data.series.length; i++) { + const y = chart.data.series[i] + // color + y.itemStyle = { + color: hexColorToRGBA(customAttr.color.colors[i % 9], customAttr.color.alpha) + } + // size + if (customAttr.size) { + if (customAttr.size.barDefault) { + y.barWidth = null + y.barGap = null + } else { + y.barWidth = customAttr.size.barWidth + y.barGap = customAttr.size.barGap + } + } + y.type = 'bar' + chart_option.legend.data.push(y.name) + chart_option.series.push(y) + } + } + // console.log(chart_option); + return chart_option +} + +export function stackBarOption(chart_option, chart) { + baseBarOption(chart_option, chart) + + // ext + chart_option.series.forEach(function(s) { + s.stack = 'stack' + s.emphasis = { + focus: 'series' + } + }) + return chart_option +} + +export function horizontalBarOption(chart_option, chart) { + // 处理shape attr + let customAttr = {} + if (chart.customAttr) { + customAttr = JSON.parse(chart.customAttr) + if (customAttr.color) { + chart_option.color = customAttr.color.colors + } + } + // 处理data + if (chart.data) { + chart_option.title.text = chart.title + chart_option.yAxis.data = chart.data.x + for (let i = 0; i < chart.data.series.length; i++) { + const y = chart.data.series[i] + // color + y.itemStyle = { + color: hexColorToRGBA(customAttr.color.colors[i % 9], customAttr.color.alpha) + } + // size + if (customAttr.size) { + if (customAttr.size.barDefault) { + y.barWidth = null + y.barGap = null + } else { + y.barWidth = customAttr.size.barWidth + y.barGap = customAttr.size.barGap + } + } + y.type = 'bar' + chart_option.legend.data.push(y.name) + chart_option.series.push(y) + } + } + // console.log(chart_option); + return chart_option +} + +export function horizontalStackBarOption(chart_option, chart) { + horizontalBarOption(chart_option, chart) + + // ext + chart_option.series.forEach(function(s) { + s.stack = 'stack' + s.emphasis = { + focus: 'series' + } + }) + return chart_option +} diff --git a/frontend/src/views/chart/chart/chart.js b/frontend/src/views/chart/chart/chart.js index ee38bc088f..b71fc5d14f 100644 --- a/frontend/src/views/chart/chart/chart.js +++ b/frontend/src/views/chart/chart/chart.js @@ -1,6 +1,19 @@ export const DEFAULT_COLOR_CASE = { value: 'default', - colors: ['#5470c6', '#91cc75', '#fac858', '#ee6666', '#73c0de', '#3ba272', '#fc8452', '#9a60b4', '#ea7ccc'] + colors: ['#5470c6', '#91cc75', '#fac858', '#ee6666', '#73c0de', '#3ba272', '#fc8452', '#9a60b4', '#ea7ccc'], + alpha: 100 +} +export const DEFAULT_SIZE = { + barDefault: true, + barWidth: 40, + barGap: 0.4, + lineWidth: 1, + lineType: 'solid', + lineSymbol: 'emptyCircle', + lineSymbolSize: 4, + pieInnerRadius: 0, + pieOuterRadius: 60, + funnelWidth: 80 } export const BASE_BAR = { title: { @@ -18,6 +31,22 @@ export const BASE_BAR = { }, series: [] } +export const HORIZONTAL_BAR = { + title: { + text: '' + }, + tooltip: {}, + legend: { + data: [] + }, + xAxis: { + type: 'value' + }, + yAxis: { + data: [] + }, + series: [] +} export const BASE_LINE = { title: { @@ -36,6 +65,78 @@ export const BASE_LINE = { series: [] } -export default { - BASE_BAR, BASE_LINE, DEFAULT_COLOR_CASE +export const BASE_PIE = { + title: { + text: '' + }, + tooltip: { + trigger: 'item', + formatter: '{a}
{b}: {c} ({d}%)' + }, + legend: {}, + series: [ + { + name: '', + type: 'pie', + radius: ['0%', '60%'], + avoidLabelOverlap: false, + emphasis: { + itemStyle: { + shadowBlur: 10, + shadowOffsetX: 0, + shadowColor: 'rgba(0, 0, 0, 0.5)' + } + }, + data: [] + } + ] +} + +export const BASE_FUNNEL = { + title: { + text: '' + }, + tooltip: { + trigger: 'item' + }, + legend: { + // data: [] + }, + series: [ + { + name: '', + type: 'funnel', + left: 'center', + top: 60, + bottom: 60, + width: '80%', + min: 0, + max: 100, + minSize: '0%', + maxSize: '100%', + sort: 'descending', + gap: 1, + // label: { + // show: true, + // position: 'inside' + // }, + labelLine: { + length: 10, + lineStyle: { + width: 1, + type: 'solid' + } + }, + itemStyle: { + borderColor: '#fff', + borderWidth: 1 + }, + emphasis: { + label: { + fontSize: 20 + } + }, + data: [] + } + ] } diff --git a/frontend/src/views/chart/chart/funnel/funnel.js b/frontend/src/views/chart/chart/funnel/funnel.js new file mode 100644 index 0000000000..a1356619ce --- /dev/null +++ b/frontend/src/views/chart/chart/funnel/funnel.js @@ -0,0 +1,41 @@ +import { hexColorToRGBA } from '@/views/chart/chart/util' + +export function baseFunnelOption(chart_option, chart) { + // 处理shape attr + let customAttr = {} + if (chart.customAttr) { + customAttr = JSON.parse(chart.customAttr) + if (customAttr.color) { + chart_option.color = customAttr.color.colors + } + } + // 处理data + if (chart.data) { + chart_option.title.text = chart.title + if (chart.data.series.length > 0) { + chart_option.series[0].name = chart.data.series[0].name + // size + if (customAttr.size) { + chart_option.series[0].width = customAttr.size.funnelWidth + '%' + } + const valueArr = chart.data.series[0].data + // max value + chart_option.series[0].max = Math.max.apply(Math, valueArr) + for (let i = 0; i < valueArr.length; i++) { + const y = { + name: chart.data.x[i], + value: valueArr[i] + } + // color + y.itemStyle = { + color: hexColorToRGBA(customAttr.color.colors[i % 9], customAttr.color.alpha) + } + y.type = 'funnel' + chart_option.series[0].data.push(y) + } + } + } + // console.log(chart_option); + return chart_option +} + diff --git a/frontend/src/views/chart/chart/line/line.js b/frontend/src/views/chart/chart/line/line.js new file mode 100644 index 0000000000..91fa2210b5 --- /dev/null +++ b/frontend/src/views/chart/chart/line/line.js @@ -0,0 +1,39 @@ +import { hexColorToRGBA } from '@/views/chart/chart/util' + +export function baseLineOption(chart_option, chart) { + // 处理shape attr + let customAttr = {} + if (chart.customAttr) { + customAttr = JSON.parse(chart.customAttr) + if (customAttr.color) { + chart_option.color = customAttr.color.colors + } + } + // 处理data + if (chart.data) { + chart_option.title.text = chart.title + chart_option.xAxis.data = chart.data.x + for (let i = 0; i < chart.data.series.length; i++) { + const y = chart.data.series[i] + // color + y.itemStyle = { + color: hexColorToRGBA(customAttr.color.colors[i % 9], customAttr.color.alpha) + } + // size + if (customAttr.size) { + y.symbol = customAttr.size.lineSymbol + y.symbolSize = customAttr.size.lineSymbolSize + y.lineStyle = { + width: customAttr.size.lineWidth, + type: customAttr.size.lineType + } + } + y.type = 'line' + chart_option.legend.data.push(y.name) + chart_option.series.push(y) + } + } + // console.log(chart_option); + return chart_option +} + diff --git a/frontend/src/views/chart/chart/pie/pie.js b/frontend/src/views/chart/chart/pie/pie.js new file mode 100644 index 0000000000..f45ed8c726 --- /dev/null +++ b/frontend/src/views/chart/chart/pie/pie.js @@ -0,0 +1,39 @@ +import { hexColorToRGBA } from '@/views/chart/chart/util' + +export function basePieOption(chart_option, chart) { + // 处理shape attr + let customAttr = {} + if (chart.customAttr) { + customAttr = JSON.parse(chart.customAttr) + if (customAttr.color) { + chart_option.color = customAttr.color.colors + } + } + // 处理data + if (chart.data) { + chart_option.title.text = chart.title + if (chart.data.series.length > 0) { + chart_option.series[0].name = chart.data.series[0].name + // size + if (customAttr.size) { + chart_option.series[0].radius = [customAttr.size.pieInnerRadius + '%', customAttr.size.pieOuterRadius + '%'] + } + const valueArr = chart.data.series[0].data + for (let i = 0; i < valueArr.length; i++) { + const y = { + name: chart.data.x[i], + value: valueArr[i] + } + // color + y.itemStyle = { + color: hexColorToRGBA(customAttr.color.colors[i % 9], customAttr.color.alpha) + } + y.type = 'pie' + chart_option.series[0].data.push(y) + } + } + } + // console.log(chart_option); + return chart_option +} + diff --git a/frontend/src/views/chart/chart/util.js b/frontend/src/views/chart/chart/util.js new file mode 100644 index 0000000000..1429a54fd2 --- /dev/null +++ b/frontend/src/views/chart/chart/util.js @@ -0,0 +1,19 @@ +export function hexColorToRGBA(hex, alpha) { + const rgb = [] // 定义rgb数组 + if (/^\#[0-9A-F]{3}$/i.test(hex)) { // 判断传入是否为#三位十六进制数 + let sixHex = '#' + hex.replace(/[0-9A-F]/ig, function(kw) { + sixHex += kw + kw // 把三位16进制数转化为六位 + }) + hex = sixHex // 保存回hex + } + if (/^#[0-9A-F]{6}$/i.test(hex)) { // 判断传入是否为#六位十六进制数 + hex.replace(/[0-9A-F]{2}/ig, function(kw) { + rgb.push(eval('0x' + kw)) // 十六进制转化为十进制并存如数组 + }) + return `rgba(${rgb.join(',')},${alpha / 100})` // 输出RGB格式颜色 + } else { + console.log(`Input ${hex} is wrong!`) + return 'rgb(0,0,0)' + } +} diff --git a/frontend/src/views/chart/components/ChartComponent.vue b/frontend/src/views/chart/components/ChartComponent.vue index 8a9440894f..dd2cebf00b 100644 --- a/frontend/src/views/chart/components/ChartComponent.vue +++ b/frontend/src/views/chart/components/ChartComponent.vue @@ -5,7 +5,11 @@ + + diff --git a/frontend/src/views/chart/components/QuotaItem.vue b/frontend/src/views/chart/components/QuotaItem.vue index 1efa6c5ced..76c07c82ce 100644 --- a/frontend/src/views/chart/components/QuotaItem.vue +++ b/frontend/src/views/chart/components/QuotaItem.vue @@ -24,10 +24,10 @@ - {{ $t('chart.quick_calc') }}(test) + {{ $t('chart.quick_calc') }}(无) - test + diff --git a/frontend/src/views/chart/components/ColorSelector.vue b/frontend/src/views/chart/components/shape_attr/ColorSelector.vue similarity index 83% rename from frontend/src/views/chart/components/ColorSelector.vue rename to frontend/src/views/chart/components/shape_attr/ColorSelector.vue index 383cd1ee4f..9b5405dc3a 100644 --- a/frontend/src/views/chart/components/ColorSelector.vue +++ b/frontend/src/views/chart/components/shape_attr/ColorSelector.vue @@ -18,8 +18,12 @@ + + + + {{ $t('chart.color') }} @@ -86,7 +90,8 @@ export default { } ], colorForm: { - colorCase: 'default' + colorCase: 'default', + alpha: 100 } } }, @@ -94,7 +99,13 @@ export default { 'chart': { handler: function() { const chart = JSON.parse(JSON.stringify(this.chart)) - this.colorForm.colorCase = chart.customAttr.color.value + if (chart.customAttr) { + const customAttr = JSON.parse(chart.customAttr) + if (customAttr.color) { + this.colorForm.colorCase = customAttr.color.value + this.colorForm.alpha = customAttr.color.alpha + } + } } } }, @@ -108,7 +119,8 @@ export default { }) this.$emit('onColorChange', { value: items[0].value, - colors: items[0].colors + colors: items[0].colors, + alpha: this.colorForm.alpha }) } } @@ -120,11 +132,20 @@ export default { padding: 6px; border: none; } +.form-item-slider>>>.el-form-item__label{ + font-size: 12px; + line-height: 38px; +} .form-item>>>.el-form-item__label{ font-size: 12px; } .el-select-dropdown__item{ padding: 0 20px; } - span{font-size: 12px} + span{ + font-size: 12px + } + .el-form-item{ + margin-bottom: 6px; + } diff --git a/frontend/src/views/chart/components/shape_attr/SizeSelector.vue b/frontend/src/views/chart/components/shape_attr/SizeSelector.vue new file mode 100644 index 0000000000..48772311bb --- /dev/null +++ b/frontend/src/views/chart/components/shape_attr/SizeSelector.vue @@ -0,0 +1,139 @@ + + + + + diff --git a/frontend/src/views/chart/group/Group.vue b/frontend/src/views/chart/group/Group.vue index a7ce7ad8cc..b07baae74e 100644 --- a/frontend/src/views/chart/group/Group.vue +++ b/frontend/src/views/chart/group/Group.vue @@ -211,7 +211,7 @@ - diff --git a/frontend/src/views/dataset/data/UpdateInfo.vue b/frontend/src/views/dataset/data/UpdateInfo.vue index 7d061ee51e..ad18afdfef 100644 --- a/frontend/src/views/dataset/data/UpdateInfo.vue +++ b/frontend/src/views/dataset/data/UpdateInfo.vue @@ -79,12 +79,11 @@ @@ -97,22 +96,22 @@ /> - + - + - + + + + + +
{{ $t('dataset.incremental_update_type') }}
+ + + {{ $t('dataset.incremental_add') }} + {{ $t('incremental_delete.incremental_update_type') }} + + +
+
+ + + +
参数:
+ + {{ $t('dataset.last_update_time') }} + {{ $t('dataset.current_update_time') }} + +
+
+ + + + + + + + + @@ -201,9 +241,33 @@ @@ -369,4 +511,13 @@ export default { .el-form-item { margin-bottom: 10px; } + + .codemirror { + height: 160px; + overflow-y: auto; + } + .codemirror >>> .CodeMirror-scroll { + height: 160px; + overflow-y: auto; + } diff --git a/frontend/src/views/panel/GrantAuth/dept/index.vue b/frontend/src/views/panel/GrantAuth/dept/index.vue new file mode 100644 index 0000000000..dcf426fa3e --- /dev/null +++ b/frontend/src/views/panel/GrantAuth/dept/index.vue @@ -0,0 +1,235 @@ + + + + + diff --git a/frontend/src/views/panel/GrantAuth/index.vue b/frontend/src/views/panel/GrantAuth/index.vue new file mode 100644 index 0000000000..da7f8fe016 --- /dev/null +++ b/frontend/src/views/panel/GrantAuth/index.vue @@ -0,0 +1,101 @@ + + + + + diff --git a/frontend/src/views/panel/GrantAuth/role/index.vue b/frontend/src/views/panel/GrantAuth/role/index.vue new file mode 100644 index 0000000000..99bca3e460 --- /dev/null +++ b/frontend/src/views/panel/GrantAuth/role/index.vue @@ -0,0 +1,144 @@ + + + + + diff --git a/frontend/src/views/panel/GrantAuth/shareTree.vue b/frontend/src/views/panel/GrantAuth/shareTree.vue new file mode 100644 index 0000000000..1eba43faa5 --- /dev/null +++ b/frontend/src/views/panel/GrantAuth/shareTree.vue @@ -0,0 +1,48 @@ + + + diff --git a/frontend/src/views/panel/GrantAuth/user/index.vue b/frontend/src/views/panel/GrantAuth/user/index.vue new file mode 100644 index 0000000000..43b3c57ac5 --- /dev/null +++ b/frontend/src/views/panel/GrantAuth/user/index.vue @@ -0,0 +1,144 @@ + + + + + diff --git a/frontend/src/views/panel/index.vue b/frontend/src/views/panel/index.vue index 26368e50b5..be6628b2d8 100644 --- a/frontend/src/views/panel/index.vue +++ b/frontend/src/views/panel/index.vue @@ -11,9 +11,9 @@ 收藏 开发中... - + 分享 - 开发中... + @@ -38,20 +38,25 @@ import DeAsideContainer from '@/components/dataease/DeAsideContainer' import PanelList from './list/PanelList' import PanelView from './list/PanelView' import PanelViewShow from './list/PanelViewShow' +import ShareTree from './GrantAuth/shareTree' export default { name: 'Panel', - components: { DeMainContainer, DeContainer, DeAsideContainer, PanelList, PanelView, PanelViewShow }, + components: { DeMainContainer, DeContainer, DeAsideContainer, PanelList, PanelView, PanelViewShow, ShareTree }, data() { return { component: PanelViewShow, param: {}, - activeName: 'PanelList' + activeName: 'PanelList', + showShare: false } }, methods: { handleClick(tab, event) { - console.log(tab, event) + // 点击分析面板需要刷新分享内容 + if (tab.name === 'panels_share') { + this.refreshShare() + } }, switchComponent(c) { console.log(c) @@ -61,6 +66,10 @@ export default { this.component = PanelViewShow break } + }, + refreshShare() { + this.showShare = false + this.$nextTick(() => (this.showShare = true)) } } } diff --git a/frontend/src/views/panel/list/PanelList.vue b/frontend/src/views/panel/list/PanelList.vue index 97b7b0e1e0..e4d33e628d 100644 --- a/frontend/src/views/panel/list/PanelList.vue +++ b/frontend/src/views/panel/list/PanelList.vue @@ -111,30 +111,31 @@ - 分享授权 - + +