From 2a766461ca4b9da8141b85e9920434c8220e88eb Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Wed, 10 Mar 2021 11:49:18 +0800 Subject: [PATCH 01/29] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8Dtoken=E7=BB=AD?= =?UTF-8?q?=E5=91=BDbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/dataease/auth/config/F2CRealm.java | 7 +-- .../io/dataease/auth/filter/JWTFilter.java | 10 ++++- .../io/dataease/auth/server/AuthServer.java | 5 +++ .../auth/service/impl/ShiroServiceImpl.java | 1 + .../java/io/dataease/auth/util/JWTUtils.java | 45 +++++++++++++++++-- .../dataease/service/sys/SysUserService.java | 1 + .../src/main/resources/ehcache/ehcache.xml | 25 ++++++++--- 7 files changed, 80 insertions(+), 14 deletions(-) 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 4dee2a8df7..5d686c2abe 100644 --- a/backend/src/main/java/io/dataease/auth/config/F2CRealm.java +++ b/backend/src/main/java/io/dataease/auth/config/F2CRealm.java @@ -13,8 +13,9 @@ import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.authz.SimpleAuthorizationInfo; import org.apache.shiro.realm.AuthorizingRealm; 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 javax.annotation.Resource; import java.util.Set; import java.util.stream.Collectors; @@ -23,7 +24,8 @@ import java.util.stream.Collectors; @Component public class F2CRealm extends AuthorizingRealm { - @Resource + @Autowired + @Lazy //shiro组件加载过早 让authUserService等一等再注入 否则 注入的可能不是代理对象 private AuthUserService authUserService; @@ -36,7 +38,6 @@ public class F2CRealm extends AuthorizingRealm { @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { Long userId = JWTUtils.tokenInfoByToken(principals.toString()).getUserId(); - //SysUserEntity user = authUserService.getUserById(userId); SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo(); Set role = authUserService.roles(userId).stream().collect(Collectors.toSet()); simpleAuthorizationInfo.addRoles(role); diff --git a/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java b/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java index 7a0602d105..3d05e91831 100644 --- a/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java +++ b/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java @@ -45,8 +45,8 @@ public class JWTFilter extends BasicHttpAuthenticationFilter { protected boolean executeLogin(ServletRequest request, ServletResponse response) throws Exception { HttpServletRequest httpServletRequest = (HttpServletRequest) request; String authorization = httpServletRequest.getHeader("Authorization"); - - if (JWTUtils.needRefresh(authorization)){ + // 当没有出现登录超时 且需要刷新token 则执行刷新token + if (!JWTUtils.loginExpire(authorization) && JWTUtils.needRefresh(authorization)){ authorization = refreshToken(request, response); } JWTToken token = new JWTToken(authorization); @@ -81,7 +81,13 @@ public class JWTFilter extends BasicHttpAuthenticationFilter { AuthUserService authUserService = CommonBeanFactory.getBean(AuthUserService.class); SysUserEntity user = authUserService.getUserById(tokenInfo.getUserId()); String password = user.getPassword(); + + // 删除老token操作时间 + JWTUtils.removeTokenExpire(token); String newToken = JWTUtils.sign(tokenInfo, password); + // 记录新token操作时间 + JWTUtils.addTokenExpire(newToken); + JWTToken jwtToken = new JWTToken(newToken); this.getSubject(request, response).login(jwtToken); // 设置响应的Header头新Token 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 bdb56b337b..474e013a69 100644 --- a/backend/src/main/java/io/dataease/auth/server/AuthServer.java +++ b/backend/src/main/java/io/dataease/auth/server/AuthServer.java @@ -49,6 +49,8 @@ public class AuthServer implements AuthApi { Map result = new HashMap<>(); TokenInfo tokenInfo = TokenInfo.builder().userId(user.getUserId()).username(username).lastLoginTime(System.currentTimeMillis()).build(); String token = JWTUtils.sign(tokenInfo, realPwd); + // 记录token操作时间 + JWTUtils.addTokenExpire(token); result.put("token", token); ServletUtils.setToken(token); return result; @@ -79,6 +81,9 @@ public class AuthServer implements AuthApi { @Override public String test() { + SysUserEntity userById = authUserService.getUserById(4L); + String nickName = userById.getNickName(); + System.out.println(nickName); return "apple"; } } diff --git a/backend/src/main/java/io/dataease/auth/service/impl/ShiroServiceImpl.java b/backend/src/main/java/io/dataease/auth/service/impl/ShiroServiceImpl.java index 83cb7d8c34..b0b52dc508 100644 --- a/backend/src/main/java/io/dataease/auth/service/impl/ShiroServiceImpl.java +++ b/backend/src/main/java/io/dataease/auth/service/impl/ShiroServiceImpl.java @@ -35,6 +35,7 @@ public class ShiroServiceImpl implements ShiroService { // filterChainDefinitionMap.put("/404", "anon"); // 登陆 // filterChainDefinitionMap.put("/api/auth/logout", "anon"); + filterChainDefinitionMap.put("/api/auth/test", "anon"); filterChainDefinitionMap.put("/api/auth/login", "anon"); // 退出 diff --git a/backend/src/main/java/io/dataease/auth/util/JWTUtils.java b/backend/src/main/java/io/dataease/auth/util/JWTUtils.java index 32b20022a7..a52c4d2485 100644 --- a/backend/src/main/java/io/dataease/auth/util/JWTUtils.java +++ b/backend/src/main/java/io/dataease/auth/util/JWTUtils.java @@ -6,9 +6,12 @@ import com.auth0.jwt.algorithms.Algorithm; import com.auth0.jwt.exceptions.JWTDecodeException; import com.auth0.jwt.interfaces.DecodedJWT; import io.dataease.auth.entity.TokenInfo; +import io.dataease.commons.utils.CommonBeanFactory; import io.dataease.commons.utils.ServletUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; +import org.springframework.cache.Cache; +import org.springframework.cache.CacheManager; import javax.servlet.http.HttpServletResponse; import java.util.Date; @@ -19,7 +22,7 @@ public class JWTUtils { // token过期时间5min (过期会自动刷新续命 目的是避免一直都是同一个token ) private static final long EXPIRE_TIME = 1*60*1000; // 登录间隔时间10min 超过这个时间强制重新登录 - private static final long Login_Interval = 10*60*1000; + private static final long Login_Interval = 2*60*1000; /** @@ -36,9 +39,10 @@ public class JWTUtils { .withClaim("userId", tokenInfo.getUserId()) .build(); DecodedJWT jwt = verifier.verify(token); - Long lastLoginTime = jwt.getClaim("lastLoginTime").asLong(); + //Long lastLoginTime = jwt.getClaim("lastLoginTime").asLong(); + Long lastOperateTime = tokenLastOperateTime(token); long now = System.currentTimeMillis(); - if (now - lastLoginTime > Login_Interval){ + if (now - lastOperateTime > Login_Interval){ // 登录超时 HttpServletResponse response = ServletUtils.response(); response.addHeader("Access-Control-Expose-Headers", "authentication-status"); @@ -74,6 +78,17 @@ public class JWTUtils { return new Date().getTime() >= exp.getTime(); } + /** + * 当前token是否登录超时 + * @param token + * @return + */ + public static boolean loginExpire(String token){ + Long now = System.currentTimeMillis(); + Long lastOperateTime = tokenLastOperateTime(token); + return now - lastOperateTime > Login_Interval; + } + public static Date getExp(String token) { try { DecodedJWT jwt = JWT.decode(token); @@ -106,4 +121,28 @@ public class JWTUtils { return null; } } + + /** + * 获取当前token上次操作时间 + * @param token + * @return + */ + public static Long tokenLastOperateTime(String token){ + CacheManager cacheManager = CommonBeanFactory.getBean(CacheManager.class); + Cache tokens_expire = cacheManager.getCache("tokens_expire"); + Long expTime = tokens_expire.get(token, Long.class); + return expTime; + } + + public static void removeTokenExpire(String token){ + CacheManager cacheManager = CommonBeanFactory.getBean(CacheManager.class); + Cache tokens_expire = cacheManager.getCache("tokens_expire"); + tokens_expire.evict(token); + } + + public static void addTokenExpire(String token){ + CacheManager cacheManager = CommonBeanFactory.getBean(CacheManager.class); + Cache tokens_expire = cacheManager.getCache("tokens_expire"); + tokens_expire.put(token, System.currentTimeMillis()); + } } 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 70fce60ae4..4e0ae14d2b 100644 --- a/backend/src/main/java/io/dataease/service/sys/SysUserService.java +++ b/backend/src/main/java/io/dataease/service/sys/SysUserService.java @@ -111,6 +111,7 @@ public class SysUserService { return sysUserMapper.updateByPrimaryKeySelective(sysUser); } + @CacheEvict(value = USER_CACHE_NAME, key = "'user' + #request.userId") public int adminUpdatePwd(SysUserPwdRequest request){ SysUser sysUser = new SysUser(); sysUser.setUserId(request.getUserId()); diff --git a/backend/src/main/resources/ehcache/ehcache.xml b/backend/src/main/resources/ehcache/ehcache.xml index 6af1c3769d..a5e5d7b09a 100644 --- a/backend/src/main/resources/ehcache/ehcache.xml +++ b/backend/src/main/resources/ehcache/ehcache.xml @@ -7,10 +7,10 @@ user.dir - 用户当前工作目录 java.io.tmpdir - 默认临时文件路径 --> - + - org.springframework.boot @@ -325,6 +314,40 @@ ehcache 2.9.1 + + + org.apache.hbase + hbase + 2.4.1 + pom + + + org.apache.hbase + hbase-client + 2.4.1 + + + org.apache.hbase + hbase-common + 2.4.1 + + + org.apache.hbase + hbase-server + 2.4.1 + + + org.apache.hbase + hbase-mapreduce + 2.4.1 + + + org.testng + testng + 6.8 + test + + diff --git a/backend/src/main/java/io/dataease/base/domain/DatasetTableField.java b/backend/src/main/java/io/dataease/base/domain/DatasetTableField.java index 6e7288c65e..9cd293962b 100644 --- a/backend/src/main/java/io/dataease/base/domain/DatasetTableField.java +++ b/backend/src/main/java/io/dataease/base/domain/DatasetTableField.java @@ -1,9 +1,12 @@ package io.dataease.base.domain; import java.io.Serializable; + +import lombok.Builder; import lombok.Data; @Data +@Builder public class DatasetTableField implements Serializable { private String id; @@ -24,4 +27,4 @@ public class DatasetTableField implements Serializable { private Integer deType; private static final long serialVersionUID = 1L; -} \ No newline at end of file +} diff --git a/backend/src/main/java/io/dataease/commons/constants/JobStatus.java b/backend/src/main/java/io/dataease/commons/constants/JobStatus.java new file mode 100644 index 0000000000..59d7672641 --- /dev/null +++ b/backend/src/main/java/io/dataease/commons/constants/JobStatus.java @@ -0,0 +1,5 @@ +package io.dataease.commons.constants; + +public enum JobStatus { + Prepare, Underway, Completed, Error +} diff --git a/backend/src/main/java/io/dataease/commons/constants/TestPlanStatus.java b/backend/src/main/java/io/dataease/commons/constants/TestPlanStatus.java deleted file mode 100644 index 24aefa1ce1..0000000000 --- a/backend/src/main/java/io/dataease/commons/constants/TestPlanStatus.java +++ /dev/null @@ -1,5 +0,0 @@ -package io.dataease.commons.constants; - -public enum TestPlanStatus { - Prepare, Underway, Completed -} diff --git a/backend/src/main/java/io/dataease/controller/dataset/DataSetTableFieldController.java b/backend/src/main/java/io/dataease/controller/dataset/DataSetTableFieldController.java index 691948db33..d4d135ccfd 100644 --- a/backend/src/main/java/io/dataease/controller/dataset/DataSetTableFieldController.java +++ b/backend/src/main/java/io/dataease/controller/dataset/DataSetTableFieldController.java @@ -19,7 +19,7 @@ public class DataSetTableFieldController { @PostMapping("list/{tableId}") public List list(@PathVariable String tableId) { - DatasetTableField datasetTableField = new DatasetTableField(); + DatasetTableField datasetTableField = DatasetTableField.builder().build(); datasetTableField.setTableId(tableId); return dataSetTableFieldsService.list(datasetTableField); } diff --git a/backend/src/main/java/io/dataease/datasource/provider/DatasourceProvider.java b/backend/src/main/java/io/dataease/datasource/provider/DatasourceProvider.java index 42c0a1a20a..d1dc06956d 100644 --- a/backend/src/main/java/io/dataease/datasource/provider/DatasourceProvider.java +++ b/backend/src/main/java/io/dataease/datasource/provider/DatasourceProvider.java @@ -23,4 +23,8 @@ public abstract class DatasourceProvider { getData(datasourceRequest); } + abstract public Long count(DatasourceRequest datasourceRequest)throws Exception; + + abstract public List getPageData(DatasourceRequest datasourceRequest) throws Exception; + } diff --git a/backend/src/main/java/io/dataease/datasource/provider/JdbcProvider.java b/backend/src/main/java/io/dataease/datasource/provider/JdbcProvider.java index d3c94c8230..4b53abfb49 100644 --- a/backend/src/main/java/io/dataease/datasource/provider/JdbcProvider.java +++ b/backend/src/main/java/io/dataease/datasource/provider/JdbcProvider.java @@ -9,6 +9,7 @@ import io.dataease.datasource.request.DatasourceRequest; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import java.sql.*; +import java.text.MessageFormat; import java.util.*; @Service("jdbc") @@ -23,23 +24,7 @@ public class JdbcProvider extends DatasourceProvider{ Statement stat = connection.createStatement(); ResultSet rs = stat.executeQuery(datasourceRequest.getQuery()) ) { - ResultSetMetaData metaData = rs.getMetaData(); - int columnCount = metaData.getColumnCount(); - while (rs.next()) { - String[] row = new String[columnCount]; - for (int j = 0; j < columnCount; j++) { - int columType = metaData.getColumnType(j + 1); - switch (columType) { - case java.sql.Types.DATE: - row[j] = rs.getDate(j + 1).toString(); - break; - default: - row[j] = rs.getString(j + 1); - break; - } - } - list.add(row); - } + list = fetchResult(rs); } catch (SQLException e){ throw new Exception("ERROR:" + e.getMessage(), e); }catch (Exception e) { @@ -48,6 +33,46 @@ public class JdbcProvider extends DatasourceProvider{ return list; } + @Override + public List getPageData(DatasourceRequest datasourceRequest) throws Exception { + List list = new LinkedList<>(); + try ( + Connection connection = getConnection(datasourceRequest); + Statement stat = connection.createStatement(); + ResultSet rs = stat.executeQuery(datasourceRequest.getQuery() + MessageFormat.format(" LIMIT {0}, {1}", (datasourceRequest.getStartPage() -1)*datasourceRequest.getPageSize(), datasourceRequest.getPageSize())) + ) { + list = fetchResult(rs); + } catch (SQLException e){ + throw new Exception("ERROR:" + e.getMessage(), e); + }catch (Exception e) { + throw new Exception("ERROR:" + e.getMessage(), e); + } + return list; + } + + + private List fetchResult( ResultSet rs) throws Exception{ + List list = new LinkedList<>(); + ResultSetMetaData metaData = rs.getMetaData(); + int columnCount = metaData.getColumnCount(); + while (rs.next()) { + String[] row = new String[columnCount]; + for (int j = 0; j < columnCount; j++) { + int columType = metaData.getColumnType(j + 1); + switch (columType) { + case java.sql.Types.DATE: + row[j] = rs.getDate(j + 1).toString(); + break; + default: + row[j] = rs.getString(j + 1); + break; + } + } + list.add(row); + } + return list; + } + @Override public List getTables(DatasourceRequest datasourceRequest) throws Exception { List tables = new ArrayList<>(); @@ -106,6 +131,19 @@ public class JdbcProvider extends DatasourceProvider{ } } + + public Long count(DatasourceRequest datasourceRequest)throws Exception{ + try (Connection con = getConnection(datasourceRequest); Statement ps = con.createStatement()) { + ResultSet resultSet = ps.executeQuery(datasourceRequest.getQuery()); + while (resultSet.next()) { + return resultSet.getLong(1); + } + } catch (Exception e) { + throw new Exception("ERROR: " + e.getMessage(), e); + } + return 0L; + } + private Connection getConnection(DatasourceRequest datasourceRequest) throws Exception { String username = null; String password = null; diff --git a/backend/src/main/java/io/dataease/datasource/request/DatasourceRequest.java b/backend/src/main/java/io/dataease/datasource/request/DatasourceRequest.java index 60d7b4f1b0..9521b50af5 100644 --- a/backend/src/main/java/io/dataease/datasource/request/DatasourceRequest.java +++ b/backend/src/main/java/io/dataease/datasource/request/DatasourceRequest.java @@ -11,5 +11,8 @@ public class DatasourceRequest { protected String query; protected String table; protected Datasource datasource; + private Long pageSize; + private Long startPage; + } 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 6e2a336853..3c409114d8 100644 --- a/backend/src/main/java/io/dataease/job/sechedule/DeScheduleJob.java +++ b/backend/src/main/java/io/dataease/job/sechedule/DeScheduleJob.java @@ -1,22 +1,25 @@ package io.dataease.job.sechedule; -import org.quartz.Job; -import org.quartz.JobExecutionContext; -import org.quartz.JobExecutionException; +import io.dataease.commons.utils.LogUtil; +import org.quartz.*; public abstract class DeScheduleJob implements Job { + protected String datasetTableId; + protected String expression; + protected String taskId; + @Override public void execute(JobExecutionContext context) throws JobExecutionException { + JobKey jobKey = context.getTrigger().getJobKey(); + JobDataMap jobDataMap = context.getJobDetail().getJobDataMap(); + this.datasetTableId = jobDataMap.getString("datasetTableId"); + this.expression = jobDataMap.getString("expression"); + this.taskId = jobDataMap.getString("taskId"); -// JobKey jobKey = context.getTrigger().getJobKey(); -// JobDataMap jobDataMap = context.getJobDetail().getJobDataMap(); -// this.resourceId = jobDataMap.getString("resourceId"); -// this.userId = jobDataMap.getString("userId"); -// this.expression = jobDataMap.getString("expression"); -// -// LogUtil.info(jobKey.getGroup() + " Running: " + resourceId); -// LogUtil.info("CronExpression: " + expression); + LogUtil.info(jobKey.getGroup() + " Running: " + datasetTableId); + LogUtil.info(jobKey.getName() + " Running: " + datasetTableId); + LogUtil.info("CronExpression: " + expression); businessExecute(context); } 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 045ba851fb..44bdf3aaad 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,11 @@ public class ScheduleManager { addOrUpdateCronJob(jobKey, triggerKey, jobClass, cron, startTime, endTime, null); } - public JobDataMap getDefaultJobDataMap(String resourceId, String expression, String userId) { + public JobDataMap getDefaultJobDataMap(String resourceId, String expression, String taskId) { JobDataMap jobDataMap = new JobDataMap(); - jobDataMap.put("resourceId", resourceId); + jobDataMap.put("datasetTableId", resourceId); + jobDataMap.put("taskId", taskId); jobDataMap.put("expression", expression); - jobDataMap.put("userId", userId); return jobDataMap; } diff --git a/backend/src/main/java/io/dataease/listener/AppStartListener.java b/backend/src/main/java/io/dataease/listener/AppStartListener.java index 11dfdfac91..f44b517d36 100644 --- a/backend/src/main/java/io/dataease/listener/AppStartListener.java +++ b/backend/src/main/java/io/dataease/listener/AppStartListener.java @@ -20,13 +20,7 @@ public class AppStartListener implements ApplicationListener list = dataSetTableTaskService.list(new DatasetTableTask()); for (DatasetTableTask task : list) { diff --git a/backend/src/main/java/io/dataease/service/ScheduleService.java b/backend/src/main/java/io/dataease/service/ScheduleService.java index 79739fa41e..5885687dcb 100644 --- a/backend/src/main/java/io/dataease/service/ScheduleService.java +++ b/backend/src/main/java/io/dataease/service/ScheduleService.java @@ -1,8 +1,8 @@ package io.dataease.service; import io.dataease.base.domain.DatasetTableTask; +import io.dataease.job.sechedule.ExtractDataJob; import io.dataease.job.sechedule.ScheduleManager; -import io.dataease.job.sechedule.TestJob; import org.apache.commons.lang3.StringUtils; import org.quartz.JobKey; import org.quartz.TriggerKey; @@ -24,8 +24,8 @@ public class ScheduleService { if (StringUtils.equalsIgnoreCase(datasetTableTask.getRate(), "0")) { scheduleManager.addOrUpdateSingleJob(new JobKey(datasetTableTask.getId(), datasetTableTask.getTableId()), new TriggerKey(datasetTableTask.getId(), datasetTableTask.getTableId()), - TestJob.class,//TODO - new Date(datasetTableTask.getStartTime())); + ExtractDataJob.class, + new Date(datasetTableTask.getStartTime()), scheduleManager.getDefaultJobDataMap(datasetTableTask.getTableId(), datasetTableTask.getCron(), datasetTableTask.getId())); } else if (StringUtils.equalsIgnoreCase(datasetTableTask.getRate(), "1")) { Date endTime; if (datasetTableTask.getEndTime() == null || datasetTableTask.getEndTime() == 0) { @@ -36,8 +36,9 @@ public class ScheduleService { scheduleManager.addOrUpdateCronJob(new JobKey(datasetTableTask.getId(), datasetTableTask.getTableId()), new TriggerKey(datasetTableTask.getId(), datasetTableTask.getTableId()), - TestJob.class,// TODO - datasetTableTask.getCron(), new Date(datasetTableTask.getStartTime()), endTime); + ExtractDataJob.class, + datasetTableTask.getCron(), new Date(datasetTableTask.getStartTime()), endTime, + scheduleManager.getDefaultJobDataMap(datasetTableTask.getTableId(), datasetTableTask.getCron(), datasetTableTask.getId())); } } 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 6bd40b6720..a74b955d40 100644 --- a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java +++ b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java @@ -71,7 +71,9 @@ public class DataSetTableService { public List list(DataSetTableRequest dataSetTableRequest) { DatasetTableExample datasetTableExample = new DatasetTableExample(); - datasetTableExample.createCriteria().andSceneIdEqualTo(dataSetTableRequest.getSceneId()); + if(StringUtils.isNotEmpty(dataSetTableRequest.getSceneId())){ + datasetTableExample.createCriteria().andSceneIdEqualTo(dataSetTableRequest.getSceneId()); + } if (StringUtils.isNotEmpty(dataSetTableRequest.getSort())) { datasetTableExample.setOrderByClause(dataSetTableRequest.getSort()); } @@ -92,7 +94,7 @@ public class DataSetTableService { } public Map> getFieldsFromDE(DataSetTableRequest dataSetTableRequest) throws Exception { - DatasetTableField datasetTableField = new DatasetTableField(); + DatasetTableField datasetTableField = DatasetTableField.builder().build(); datasetTableField.setTableId(dataSetTableRequest.getId()); datasetTableField.setChecked(Boolean.TRUE); List fields = dataSetTableFieldsService.list(datasetTableField); @@ -121,7 +123,7 @@ public class DataSetTableService { datasourceRequest.setDatasource(ds); String table = new Gson().fromJson(dataSetTableRequest.getInfo(), DataTableInfoDTO.class).getTable(); - DatasetTableField datasetTableField = new DatasetTableField(); + DatasetTableField datasetTableField = DatasetTableField.builder().build(); datasetTableField.setTableId(dataSetTableRequest.getId()); datasetTableField.setChecked(Boolean.TRUE); List fields = dataSetTableFieldsService.list(datasetTableField); @@ -137,15 +139,13 @@ public class DataSetTableService { DatasourceRequest datasourceRequest = new DatasourceRequest(); datasourceRequest.setDatasource(ds); String table = new Gson().fromJson(dataSetTableRequest.getInfo(), DataTableInfoDTO.class).getTable(); -// datasourceRequest.setTable(table); - DatasetTableField datasetTableField = new DatasetTableField(); + DatasetTableField datasetTableField = DatasetTableField.builder().build(); datasetTableField.setTableId(dataSetTableRequest.getId()); datasetTableField.setChecked(Boolean.TRUE); List fields = dataSetTableFieldsService.list(datasetTableField); String[] fieldArray = fields.stream().map(DatasetTableField::getOriginName).toArray(String[]::new); -// datasourceRequest.setQuery("SELECT " + StringUtils.join(fieldArray, ",") + " FROM " + table + " LIMIT 0,10;"); datasourceRequest.setQuery(createQuerySQL(ds.getType(), table, fieldArray) + " LIMIT 0,10"); List data = new ArrayList<>(); @@ -154,17 +154,6 @@ public class DataSetTableService { } catch (Exception e) { } - - /*JSONArray jsonArray = new JSONArray(); - if (CollectionUtils.isNotEmpty(data)) { - data.forEach(ele -> { - JSONObject jsonObject = new JSONObject(); - for (int i = 0; i < ele.length; i++) { - jsonObject.put(fieldArray[i], ele[i]); - } - jsonArray.add(jsonObject); - }); - }*/ List> jsonArray = new ArrayList<>(); if (CollectionUtils.isNotEmpty(data)) { jsonArray = data.stream().map(ele -> { @@ -184,6 +173,53 @@ public class DataSetTableService { return map; } + public List getDataSetData(String datasourceId, String table, List fields){ + List data = new ArrayList<>(); + Datasource ds = datasourceMapper.selectByPrimaryKey(datasourceId); + DatasourceProvider datasourceProvider = ProviderFactory.getProvider(ds.getType()); + DatasourceRequest datasourceRequest = new DatasourceRequest(); + datasourceRequest.setDatasource(ds); + String[] fieldArray = fields.stream().map(DatasetTableField::getOriginName).toArray(String[]::new); + datasourceRequest.setQuery(createQuerySQL(ds.getType(), table, fieldArray) + " LIMIT 0, 10"); + try { + data.addAll(datasourceProvider.getData(datasourceRequest)); + } catch (Exception e) { + } + return data; + } + + public Long getDataSetTotalData(String datasourceId, String table){ + List data = new ArrayList<>(); + Datasource ds = datasourceMapper.selectByPrimaryKey(datasourceId); + DatasourceProvider datasourceProvider = ProviderFactory.getProvider(ds.getType()); + DatasourceRequest datasourceRequest = new DatasourceRequest(); + datasourceRequest.setDatasource(ds); + datasourceRequest.setQuery("select count(*) from " + table); + try { + return datasourceProvider.count(datasourceRequest); + } catch (Exception e) { + + } + return 0l; + } + + public List getDataSetPageData(String datasourceId, String table, List fields, Long startPage, Long pageSize){ + List data = new ArrayList<>(); + Datasource ds = datasourceMapper.selectByPrimaryKey(datasourceId); + DatasourceProvider datasourceProvider = ProviderFactory.getProvider(ds.getType()); + DatasourceRequest datasourceRequest = new DatasourceRequest(); + datasourceRequest.setDatasource(ds); + String[] fieldArray = fields.stream().map(DatasetTableField::getOriginName).toArray(String[]::new); + datasourceRequest.setPageSize(pageSize); + datasourceRequest.setStartPage(startPage); + datasourceRequest.setQuery(createQuerySQL(ds.getType(), table, fieldArray)); + 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(); @@ -193,7 +229,7 @@ public class DataSetTableService { if (CollectionUtils.isNotEmpty(fields)) { for (int i = 0; i < fields.size(); i++) { TableFiled filed = fields.get(i); - DatasetTableField datasetTableField = new DatasetTableField(); + DatasetTableField datasetTableField = DatasetTableField.builder().build(); datasetTableField.setTableId(datasetTable.getId()); datasetTableField.setOriginName(filed.getFieldName()); datasetTableField.setName(filed.getRemarks()); diff --git a/backend/src/main/java/io/dataease/service/dataset/DataSetTableTaskLogService.java b/backend/src/main/java/io/dataease/service/dataset/DataSetTableTaskLogService.java index fe687d4f75..783e564be7 100644 --- a/backend/src/main/java/io/dataease/service/dataset/DataSetTableTaskLogService.java +++ b/backend/src/main/java/io/dataease/service/dataset/DataSetTableTaskLogService.java @@ -48,4 +48,11 @@ public class DataSetTableTaskLogService { return extDataSetTaskMapper.list(request); } + public void deleteByTaskId(String taskId){ + DatasetTableTaskLogExample datasetTableTaskLogExample = new DatasetTableTaskLogExample(); + DatasetTableTaskLogExample.Criteria criteria = datasetTableTaskLogExample.createCriteria(); + criteria.andTaskIdEqualTo(taskId); + datasetTableTaskLogMapper.deleteByExample(datasetTableTaskLogExample); + } + } 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 44d5d0719e..4f54ea0b3e 100644 --- a/backend/src/main/java/io/dataease/service/dataset/DataSetTableTaskService.java +++ b/backend/src/main/java/io/dataease/service/dataset/DataSetTableTaskService.java @@ -20,7 +20,8 @@ import java.util.UUID; public class DataSetTableTaskService { @Resource private DatasetTableTaskMapper datasetTableTaskMapper; - + @Resource + private DataSetTableTaskLogService dataSetTableTaskLogService; @Resource private ScheduleService scheduleService; @@ -46,6 +47,11 @@ public class DataSetTableTaskService { DatasetTableTask datasetTableTask = datasetTableTaskMapper.selectByPrimaryKey(id); datasetTableTaskMapper.deleteByPrimaryKey(id); scheduleService.deleteSchedule(datasetTableTask); + dataSetTableTaskLogService.deleteByTaskId(id); + } + + public DatasetTableTask get(String id) { + return datasetTableTaskMapper.selectByPrimaryKey(id); } public List list(DatasetTableTask datasetTableTask) { From afec128fc686a4e2f78c1139d6752c760713e559 Mon Sep 17 00:00:00 2001 From: junjie Date: Wed, 10 Mar 2021 18:23:25 +0800 Subject: [PATCH 06/29] =?UTF-8?q?feat(=E8=A7=86=E5=9B=BE):=20=E8=A7=86?= =?UTF-8?q?=E5=9B=BE=E7=BC=96=E8=BE=91UI=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/lang/zh.js | 3 +- frontend/src/views/chart/view/ChartEdit.vue | 68 +++++++++++++++------ 2 files changed, 53 insertions(+), 18 deletions(-) diff --git a/frontend/src/lang/zh.js b/frontend/src/lang/zh.js index 07f0a2e694..feac4aeec0 100644 --- a/frontend/src/lang/zh.js +++ b/frontend/src/lang/zh.js @@ -589,7 +589,8 @@ export default { result_filter: '结果过滤器', x_axis: '横轴', y_axis: '纵轴', - chart: '视图' + chart: '视图', + close: '关闭' }, dataset: { datalist: '数据集', diff --git a/frontend/src/views/chart/view/ChartEdit.vue b/frontend/src/views/chart/view/ChartEdit.vue index 8ea829d28f..d4e29f733e 100644 --- a/frontend/src/views/chart/view/ChartEdit.vue +++ b/frontend/src/views/chart/view/ChartEdit.vue @@ -7,12 +7,12 @@ {{ view.name }} - - {{ $t('chart.cancel') }} - - - {{ $t('chart.confirm') }} + + {{ $t('chart.close') }} + + + @@ -69,6 +69,7 @@ :placeholder="$t('chart.title')" prefix-icon="el-icon-search" clearable + @blur="save" /> @@ -109,12 +110,12 @@ @end="end2" > - + - {{ item.name }} + {{ item.name }} @@ -141,16 +142,23 @@ @end="end2" > - + - {{ item.name }} + {{ item.name }} - item3 + + + item3 + + + sub1 + + item4 @@ -224,7 +232,13 @@ export default { } }, - watch: {}, + watch: { + 'view.type': { + handler: function() { + this.save() + } + } + }, created() { // this.get(this.$store.state.chart.viewId); }, @@ -296,6 +310,9 @@ export default { this.$store.dispatch('chart/setChartSceneData', this.sceneId) }) }, + closeEdit() { + this.$emit('switchComponent', { name: '' }) + }, getData(id) { if (id) { post('/chart/view/getData/' + id, null).then(response => { @@ -333,6 +350,8 @@ export default { e.clone.className = 'item' e.item.className = 'item' this.refuseMove(e) + this.removeCheckedKey(e) + this.save() }, start2(e) { console.log(e) @@ -341,9 +360,24 @@ export default { end2(e) { console.log(e) this.removeDuplicateKey(e) + this.save() + }, + removeCheckedKey(e) { + const that = this + const xItems = this.view.xaxis.filter(function(m) { + return m.id === that.moveId + }) + const yItems = this.view.yaxis.filter(function(m) { + return m.id === that.moveId + }) + if (xItems && xItems.length > 1) { + this.view.xaxis.splice(e.newDraggableIndex, 1) + } + if (yItems && yItems.length > 1) { + this.view.yaxis.splice(e.newDraggableIndex, 1) + } }, refuseMove(e) { - // TODO 最后逻辑再思考下... const that = this const xItems = this.dimension.filter(function(m) { return m.id === that.moveId @@ -351,11 +385,11 @@ export default { const yItems = this.quota.filter(function(m) { return m.id === that.moveId }) - if (xItems && xItems.length > 0) { - this.dimension.splice(e.oldDraggableIndex, 0) + if (xItems && xItems.length > 1) { + this.dimension.splice(e.newDraggableIndex, 1) } - if (yItems && yItems.length > 0) { - this.quota.splice(e.oldDraggableIndex, 0) + if (yItems && yItems.length > 1) { + this.quota.splice(e.newDraggableIndex, 1) } }, removeDuplicateKey(e) { @@ -451,7 +485,7 @@ export default { .item-axis { padding: 1px 8px; - margin: 0 3px; + margin: 0 3px 2px 3px; border: solid 1px #eee; background-color: #f1f1f1; text-align: left; From d449e41cc13508e9cb1170c148b09a80e736acac Mon Sep 17 00:00:00 2001 From: taojinlong Date: Wed, 10 Mar 2021 18:13:27 +0800 Subject: [PATCH 07/29] =?UTF-8?q?feat:=20=E6=8A=BD=E5=8F=96=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=88=B0hbase?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/pom.xml | 45 ++++++--- .../base/domain/DatasetTableField.java | 5 +- .../commons/constants/DatasetMode.java | 6 ++ .../dataease/commons/constants/JobStatus.java | 5 + .../commons/constants/TestPlanStatus.java | 5 - .../java/io/dataease/config/HbaseConfig.java | 30 ++++++ .../dataset/DataSetTableFieldController.java | 2 +- .../provider/DatasourceProvider.java | 4 + .../datasource/provider/JdbcProvider.java | 72 ++++++++++---- .../datasource/request/DatasourceRequest.java | 3 + .../dataease/job/sechedule/DeScheduleJob.java | 25 ++--- .../job/sechedule/ExtractDataJob.java | 22 +++++ .../job/sechedule/ScheduleManager.java | 6 +- .../dataease/listener/AppStartListener.java | 8 +- .../io/dataease/service/ScheduleService.java | 11 ++- .../service/dataset/DataSetTableService.java | 72 ++++++++++---- .../dataset/DataSetTableTaskLogService.java | 7 ++ .../dataset/DataSetTableTaskService.java | 8 +- .../service/dataset/ExtractDataService.java | 93 +++++++++++++++++++ pom.xml | 4 +- 20 files changed, 351 insertions(+), 82 deletions(-) create mode 100644 backend/src/main/java/io/dataease/commons/constants/DatasetMode.java create mode 100644 backend/src/main/java/io/dataease/commons/constants/JobStatus.java delete mode 100644 backend/src/main/java/io/dataease/commons/constants/TestPlanStatus.java create mode 100644 backend/src/main/java/io/dataease/config/HbaseConfig.java create mode 100644 backend/src/main/java/io/dataease/job/sechedule/ExtractDataJob.java create mode 100644 backend/src/main/java/io/dataease/service/dataset/ExtractDataService.java diff --git a/backend/pom.xml b/backend/pom.xml index c814656394..f22eacfbe2 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -303,17 +303,6 @@ reflections8 0.11.7 - - org.springframework.boot @@ -325,6 +314,40 @@ ehcache 2.9.1 + + + org.apache.hbase + hbase + 2.4.1 + pom + + + org.apache.hbase + hbase-client + 2.4.1 + + + org.apache.hbase + hbase-common + 2.4.1 + + + org.apache.hbase + hbase-server + 2.4.1 + + + org.apache.hbase + hbase-mapreduce + 2.4.1 + + + org.testng + testng + 6.8 + test + + diff --git a/backend/src/main/java/io/dataease/base/domain/DatasetTableField.java b/backend/src/main/java/io/dataease/base/domain/DatasetTableField.java index 6e7288c65e..9cd293962b 100644 --- a/backend/src/main/java/io/dataease/base/domain/DatasetTableField.java +++ b/backend/src/main/java/io/dataease/base/domain/DatasetTableField.java @@ -1,9 +1,12 @@ package io.dataease.base.domain; import java.io.Serializable; + +import lombok.Builder; import lombok.Data; @Data +@Builder public class DatasetTableField implements Serializable { private String id; @@ -24,4 +27,4 @@ public class DatasetTableField implements Serializable { private Integer deType; private static final long serialVersionUID = 1L; -} \ No newline at end of file +} diff --git a/backend/src/main/java/io/dataease/commons/constants/DatasetMode.java b/backend/src/main/java/io/dataease/commons/constants/DatasetMode.java new file mode 100644 index 0000000000..b47fe5c05f --- /dev/null +++ b/backend/src/main/java/io/dataease/commons/constants/DatasetMode.java @@ -0,0 +1,6 @@ +package io.dataease.commons.constants; + +public class DatasetMode { + public static final String EXTRACT = "1"; + public static final String DIRECT = "0"; +} diff --git a/backend/src/main/java/io/dataease/commons/constants/JobStatus.java b/backend/src/main/java/io/dataease/commons/constants/JobStatus.java new file mode 100644 index 0000000000..59d7672641 --- /dev/null +++ b/backend/src/main/java/io/dataease/commons/constants/JobStatus.java @@ -0,0 +1,5 @@ +package io.dataease.commons.constants; + +public enum JobStatus { + Prepare, Underway, Completed, Error +} diff --git a/backend/src/main/java/io/dataease/commons/constants/TestPlanStatus.java b/backend/src/main/java/io/dataease/commons/constants/TestPlanStatus.java deleted file mode 100644 index 24aefa1ce1..0000000000 --- a/backend/src/main/java/io/dataease/commons/constants/TestPlanStatus.java +++ /dev/null @@ -1,5 +0,0 @@ -package io.dataease.commons.constants; - -public enum TestPlanStatus { - Prepare, Underway, Completed -} diff --git a/backend/src/main/java/io/dataease/config/HbaseConfig.java b/backend/src/main/java/io/dataease/config/HbaseConfig.java new file mode 100644 index 0000000000..f7b8bfaece --- /dev/null +++ b/backend/src/main/java/io/dataease/config/HbaseConfig.java @@ -0,0 +1,30 @@ +package io.dataease.config; + +import com.fit2cloud.autoconfigure.QuartzAutoConfiguration; +import org.springframework.boot.autoconfigure.AutoConfigureBefore; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.DependsOn; +import org.springframework.core.env.Environment; + +import javax.annotation.Resource; + +@Configuration +@AutoConfigureBefore(QuartzAutoConfiguration.class) +public class HbaseConfig { + + @Resource + private Environment env; // 保存了配置文件的信息 + + + @Bean + @ConditionalOnMissingBean + public org.apache.hadoop.conf.Configuration configuration(){ + org.apache.hadoop.conf.Configuration configuration = new org.apache.hadoop.conf.Configuration(); + configuration.set("hbase.zookeeper.quorum", env.getProperty("hbase.zookeeper.quorum")); + configuration.set("hbase.zookeeper.property.clientPort", env.getProperty("hbase.zookeeper.property.clientPort")); + configuration.set("hbase.client.retries.number", env.getProperty("hbase.client.retries.number", "1")); + return configuration; + } +} diff --git a/backend/src/main/java/io/dataease/controller/dataset/DataSetTableFieldController.java b/backend/src/main/java/io/dataease/controller/dataset/DataSetTableFieldController.java index 691948db33..d4d135ccfd 100644 --- a/backend/src/main/java/io/dataease/controller/dataset/DataSetTableFieldController.java +++ b/backend/src/main/java/io/dataease/controller/dataset/DataSetTableFieldController.java @@ -19,7 +19,7 @@ public class DataSetTableFieldController { @PostMapping("list/{tableId}") public List list(@PathVariable String tableId) { - DatasetTableField datasetTableField = new DatasetTableField(); + DatasetTableField datasetTableField = DatasetTableField.builder().build(); datasetTableField.setTableId(tableId); return dataSetTableFieldsService.list(datasetTableField); } diff --git a/backend/src/main/java/io/dataease/datasource/provider/DatasourceProvider.java b/backend/src/main/java/io/dataease/datasource/provider/DatasourceProvider.java index 42c0a1a20a..d1dc06956d 100644 --- a/backend/src/main/java/io/dataease/datasource/provider/DatasourceProvider.java +++ b/backend/src/main/java/io/dataease/datasource/provider/DatasourceProvider.java @@ -23,4 +23,8 @@ public abstract class DatasourceProvider { getData(datasourceRequest); } + abstract public Long count(DatasourceRequest datasourceRequest)throws Exception; + + abstract public List getPageData(DatasourceRequest datasourceRequest) throws Exception; + } diff --git a/backend/src/main/java/io/dataease/datasource/provider/JdbcProvider.java b/backend/src/main/java/io/dataease/datasource/provider/JdbcProvider.java index d3c94c8230..4b53abfb49 100644 --- a/backend/src/main/java/io/dataease/datasource/provider/JdbcProvider.java +++ b/backend/src/main/java/io/dataease/datasource/provider/JdbcProvider.java @@ -9,6 +9,7 @@ import io.dataease.datasource.request.DatasourceRequest; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import java.sql.*; +import java.text.MessageFormat; import java.util.*; @Service("jdbc") @@ -23,23 +24,7 @@ public class JdbcProvider extends DatasourceProvider{ Statement stat = connection.createStatement(); ResultSet rs = stat.executeQuery(datasourceRequest.getQuery()) ) { - ResultSetMetaData metaData = rs.getMetaData(); - int columnCount = metaData.getColumnCount(); - while (rs.next()) { - String[] row = new String[columnCount]; - for (int j = 0; j < columnCount; j++) { - int columType = metaData.getColumnType(j + 1); - switch (columType) { - case java.sql.Types.DATE: - row[j] = rs.getDate(j + 1).toString(); - break; - default: - row[j] = rs.getString(j + 1); - break; - } - } - list.add(row); - } + list = fetchResult(rs); } catch (SQLException e){ throw new Exception("ERROR:" + e.getMessage(), e); }catch (Exception e) { @@ -48,6 +33,46 @@ public class JdbcProvider extends DatasourceProvider{ return list; } + @Override + public List getPageData(DatasourceRequest datasourceRequest) throws Exception { + List list = new LinkedList<>(); + try ( + Connection connection = getConnection(datasourceRequest); + Statement stat = connection.createStatement(); + ResultSet rs = stat.executeQuery(datasourceRequest.getQuery() + MessageFormat.format(" LIMIT {0}, {1}", (datasourceRequest.getStartPage() -1)*datasourceRequest.getPageSize(), datasourceRequest.getPageSize())) + ) { + list = fetchResult(rs); + } catch (SQLException e){ + throw new Exception("ERROR:" + e.getMessage(), e); + }catch (Exception e) { + throw new Exception("ERROR:" + e.getMessage(), e); + } + return list; + } + + + private List fetchResult( ResultSet rs) throws Exception{ + List list = new LinkedList<>(); + ResultSetMetaData metaData = rs.getMetaData(); + int columnCount = metaData.getColumnCount(); + while (rs.next()) { + String[] row = new String[columnCount]; + for (int j = 0; j < columnCount; j++) { + int columType = metaData.getColumnType(j + 1); + switch (columType) { + case java.sql.Types.DATE: + row[j] = rs.getDate(j + 1).toString(); + break; + default: + row[j] = rs.getString(j + 1); + break; + } + } + list.add(row); + } + return list; + } + @Override public List getTables(DatasourceRequest datasourceRequest) throws Exception { List tables = new ArrayList<>(); @@ -106,6 +131,19 @@ public class JdbcProvider extends DatasourceProvider{ } } + + public Long count(DatasourceRequest datasourceRequest)throws Exception{ + try (Connection con = getConnection(datasourceRequest); Statement ps = con.createStatement()) { + ResultSet resultSet = ps.executeQuery(datasourceRequest.getQuery()); + while (resultSet.next()) { + return resultSet.getLong(1); + } + } catch (Exception e) { + throw new Exception("ERROR: " + e.getMessage(), e); + } + return 0L; + } + private Connection getConnection(DatasourceRequest datasourceRequest) throws Exception { String username = null; String password = null; diff --git a/backend/src/main/java/io/dataease/datasource/request/DatasourceRequest.java b/backend/src/main/java/io/dataease/datasource/request/DatasourceRequest.java index 60d7b4f1b0..9521b50af5 100644 --- a/backend/src/main/java/io/dataease/datasource/request/DatasourceRequest.java +++ b/backend/src/main/java/io/dataease/datasource/request/DatasourceRequest.java @@ -11,5 +11,8 @@ public class DatasourceRequest { protected String query; protected String table; protected Datasource datasource; + private Long pageSize; + private Long startPage; + } 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 6e2a336853..3c409114d8 100644 --- a/backend/src/main/java/io/dataease/job/sechedule/DeScheduleJob.java +++ b/backend/src/main/java/io/dataease/job/sechedule/DeScheduleJob.java @@ -1,22 +1,25 @@ package io.dataease.job.sechedule; -import org.quartz.Job; -import org.quartz.JobExecutionContext; -import org.quartz.JobExecutionException; +import io.dataease.commons.utils.LogUtil; +import org.quartz.*; public abstract class DeScheduleJob implements Job { + protected String datasetTableId; + protected String expression; + protected String taskId; + @Override public void execute(JobExecutionContext context) throws JobExecutionException { + JobKey jobKey = context.getTrigger().getJobKey(); + JobDataMap jobDataMap = context.getJobDetail().getJobDataMap(); + this.datasetTableId = jobDataMap.getString("datasetTableId"); + this.expression = jobDataMap.getString("expression"); + this.taskId = jobDataMap.getString("taskId"); -// JobKey jobKey = context.getTrigger().getJobKey(); -// JobDataMap jobDataMap = context.getJobDetail().getJobDataMap(); -// this.resourceId = jobDataMap.getString("resourceId"); -// this.userId = jobDataMap.getString("userId"); -// this.expression = jobDataMap.getString("expression"); -// -// LogUtil.info(jobKey.getGroup() + " Running: " + resourceId); -// LogUtil.info("CronExpression: " + expression); + LogUtil.info(jobKey.getGroup() + " Running: " + datasetTableId); + LogUtil.info(jobKey.getName() + " Running: " + datasetTableId); + LogUtil.info("CronExpression: " + expression); businessExecute(context); } diff --git a/backend/src/main/java/io/dataease/job/sechedule/ExtractDataJob.java b/backend/src/main/java/io/dataease/job/sechedule/ExtractDataJob.java new file mode 100644 index 0000000000..2704f33a02 --- /dev/null +++ b/backend/src/main/java/io/dataease/job/sechedule/ExtractDataJob.java @@ -0,0 +1,22 @@ +package io.dataease.job.sechedule; + +import io.dataease.commons.utils.CommonBeanFactory; +import io.dataease.service.dataset.ExtractDataService; +import org.quartz.JobExecutionContext; +import org.springframework.stereotype.Component; + +@Component +public class ExtractDataJob extends DeScheduleJob{ + private ExtractDataService extractDataService; + + public ExtractDataJob() { + extractDataService = (ExtractDataService) CommonBeanFactory.getBean(ExtractDataService.class); + } + + + @Override + void businessExecute(JobExecutionContext context) { + extractDataService.extractData(datasetTableId, taskId); + } + +} 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 045ba851fb..44bdf3aaad 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,11 @@ public class ScheduleManager { addOrUpdateCronJob(jobKey, triggerKey, jobClass, cron, startTime, endTime, null); } - public JobDataMap getDefaultJobDataMap(String resourceId, String expression, String userId) { + public JobDataMap getDefaultJobDataMap(String resourceId, String expression, String taskId) { JobDataMap jobDataMap = new JobDataMap(); - jobDataMap.put("resourceId", resourceId); + jobDataMap.put("datasetTableId", resourceId); + jobDataMap.put("taskId", taskId); jobDataMap.put("expression", expression); - jobDataMap.put("userId", userId); return jobDataMap; } diff --git a/backend/src/main/java/io/dataease/listener/AppStartListener.java b/backend/src/main/java/io/dataease/listener/AppStartListener.java index 11dfdfac91..f44b517d36 100644 --- a/backend/src/main/java/io/dataease/listener/AppStartListener.java +++ b/backend/src/main/java/io/dataease/listener/AppStartListener.java @@ -20,13 +20,7 @@ public class AppStartListener implements ApplicationListener list = dataSetTableTaskService.list(new DatasetTableTask()); for (DatasetTableTask task : list) { diff --git a/backend/src/main/java/io/dataease/service/ScheduleService.java b/backend/src/main/java/io/dataease/service/ScheduleService.java index 79739fa41e..5885687dcb 100644 --- a/backend/src/main/java/io/dataease/service/ScheduleService.java +++ b/backend/src/main/java/io/dataease/service/ScheduleService.java @@ -1,8 +1,8 @@ package io.dataease.service; import io.dataease.base.domain.DatasetTableTask; +import io.dataease.job.sechedule.ExtractDataJob; import io.dataease.job.sechedule.ScheduleManager; -import io.dataease.job.sechedule.TestJob; import org.apache.commons.lang3.StringUtils; import org.quartz.JobKey; import org.quartz.TriggerKey; @@ -24,8 +24,8 @@ public class ScheduleService { if (StringUtils.equalsIgnoreCase(datasetTableTask.getRate(), "0")) { scheduleManager.addOrUpdateSingleJob(new JobKey(datasetTableTask.getId(), datasetTableTask.getTableId()), new TriggerKey(datasetTableTask.getId(), datasetTableTask.getTableId()), - TestJob.class,//TODO - new Date(datasetTableTask.getStartTime())); + ExtractDataJob.class, + new Date(datasetTableTask.getStartTime()), scheduleManager.getDefaultJobDataMap(datasetTableTask.getTableId(), datasetTableTask.getCron(), datasetTableTask.getId())); } else if (StringUtils.equalsIgnoreCase(datasetTableTask.getRate(), "1")) { Date endTime; if (datasetTableTask.getEndTime() == null || datasetTableTask.getEndTime() == 0) { @@ -36,8 +36,9 @@ public class ScheduleService { scheduleManager.addOrUpdateCronJob(new JobKey(datasetTableTask.getId(), datasetTableTask.getTableId()), new TriggerKey(datasetTableTask.getId(), datasetTableTask.getTableId()), - TestJob.class,// TODO - datasetTableTask.getCron(), new Date(datasetTableTask.getStartTime()), endTime); + ExtractDataJob.class, + datasetTableTask.getCron(), new Date(datasetTableTask.getStartTime()), endTime, + scheduleManager.getDefaultJobDataMap(datasetTableTask.getTableId(), datasetTableTask.getCron(), datasetTableTask.getId())); } } 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 6bd40b6720..a74b955d40 100644 --- a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java +++ b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java @@ -71,7 +71,9 @@ public class DataSetTableService { public List list(DataSetTableRequest dataSetTableRequest) { DatasetTableExample datasetTableExample = new DatasetTableExample(); - datasetTableExample.createCriteria().andSceneIdEqualTo(dataSetTableRequest.getSceneId()); + if(StringUtils.isNotEmpty(dataSetTableRequest.getSceneId())){ + datasetTableExample.createCriteria().andSceneIdEqualTo(dataSetTableRequest.getSceneId()); + } if (StringUtils.isNotEmpty(dataSetTableRequest.getSort())) { datasetTableExample.setOrderByClause(dataSetTableRequest.getSort()); } @@ -92,7 +94,7 @@ public class DataSetTableService { } public Map> getFieldsFromDE(DataSetTableRequest dataSetTableRequest) throws Exception { - DatasetTableField datasetTableField = new DatasetTableField(); + DatasetTableField datasetTableField = DatasetTableField.builder().build(); datasetTableField.setTableId(dataSetTableRequest.getId()); datasetTableField.setChecked(Boolean.TRUE); List fields = dataSetTableFieldsService.list(datasetTableField); @@ -121,7 +123,7 @@ public class DataSetTableService { datasourceRequest.setDatasource(ds); String table = new Gson().fromJson(dataSetTableRequest.getInfo(), DataTableInfoDTO.class).getTable(); - DatasetTableField datasetTableField = new DatasetTableField(); + DatasetTableField datasetTableField = DatasetTableField.builder().build(); datasetTableField.setTableId(dataSetTableRequest.getId()); datasetTableField.setChecked(Boolean.TRUE); List fields = dataSetTableFieldsService.list(datasetTableField); @@ -137,15 +139,13 @@ public class DataSetTableService { DatasourceRequest datasourceRequest = new DatasourceRequest(); datasourceRequest.setDatasource(ds); String table = new Gson().fromJson(dataSetTableRequest.getInfo(), DataTableInfoDTO.class).getTable(); -// datasourceRequest.setTable(table); - DatasetTableField datasetTableField = new DatasetTableField(); + DatasetTableField datasetTableField = DatasetTableField.builder().build(); datasetTableField.setTableId(dataSetTableRequest.getId()); datasetTableField.setChecked(Boolean.TRUE); List fields = dataSetTableFieldsService.list(datasetTableField); String[] fieldArray = fields.stream().map(DatasetTableField::getOriginName).toArray(String[]::new); -// datasourceRequest.setQuery("SELECT " + StringUtils.join(fieldArray, ",") + " FROM " + table + " LIMIT 0,10;"); datasourceRequest.setQuery(createQuerySQL(ds.getType(), table, fieldArray) + " LIMIT 0,10"); List data = new ArrayList<>(); @@ -154,17 +154,6 @@ public class DataSetTableService { } catch (Exception e) { } - - /*JSONArray jsonArray = new JSONArray(); - if (CollectionUtils.isNotEmpty(data)) { - data.forEach(ele -> { - JSONObject jsonObject = new JSONObject(); - for (int i = 0; i < ele.length; i++) { - jsonObject.put(fieldArray[i], ele[i]); - } - jsonArray.add(jsonObject); - }); - }*/ List> jsonArray = new ArrayList<>(); if (CollectionUtils.isNotEmpty(data)) { jsonArray = data.stream().map(ele -> { @@ -184,6 +173,53 @@ public class DataSetTableService { return map; } + public List getDataSetData(String datasourceId, String table, List fields){ + List data = new ArrayList<>(); + Datasource ds = datasourceMapper.selectByPrimaryKey(datasourceId); + DatasourceProvider datasourceProvider = ProviderFactory.getProvider(ds.getType()); + DatasourceRequest datasourceRequest = new DatasourceRequest(); + datasourceRequest.setDatasource(ds); + String[] fieldArray = fields.stream().map(DatasetTableField::getOriginName).toArray(String[]::new); + datasourceRequest.setQuery(createQuerySQL(ds.getType(), table, fieldArray) + " LIMIT 0, 10"); + try { + data.addAll(datasourceProvider.getData(datasourceRequest)); + } catch (Exception e) { + } + return data; + } + + public Long getDataSetTotalData(String datasourceId, String table){ + List data = new ArrayList<>(); + Datasource ds = datasourceMapper.selectByPrimaryKey(datasourceId); + DatasourceProvider datasourceProvider = ProviderFactory.getProvider(ds.getType()); + DatasourceRequest datasourceRequest = new DatasourceRequest(); + datasourceRequest.setDatasource(ds); + datasourceRequest.setQuery("select count(*) from " + table); + try { + return datasourceProvider.count(datasourceRequest); + } catch (Exception e) { + + } + return 0l; + } + + public List getDataSetPageData(String datasourceId, String table, List fields, Long startPage, Long pageSize){ + List data = new ArrayList<>(); + Datasource ds = datasourceMapper.selectByPrimaryKey(datasourceId); + DatasourceProvider datasourceProvider = ProviderFactory.getProvider(ds.getType()); + DatasourceRequest datasourceRequest = new DatasourceRequest(); + datasourceRequest.setDatasource(ds); + String[] fieldArray = fields.stream().map(DatasetTableField::getOriginName).toArray(String[]::new); + datasourceRequest.setPageSize(pageSize); + datasourceRequest.setStartPage(startPage); + datasourceRequest.setQuery(createQuerySQL(ds.getType(), table, fieldArray)); + 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(); @@ -193,7 +229,7 @@ public class DataSetTableService { if (CollectionUtils.isNotEmpty(fields)) { for (int i = 0; i < fields.size(); i++) { TableFiled filed = fields.get(i); - DatasetTableField datasetTableField = new DatasetTableField(); + DatasetTableField datasetTableField = DatasetTableField.builder().build(); datasetTableField.setTableId(datasetTable.getId()); datasetTableField.setOriginName(filed.getFieldName()); datasetTableField.setName(filed.getRemarks()); diff --git a/backend/src/main/java/io/dataease/service/dataset/DataSetTableTaskLogService.java b/backend/src/main/java/io/dataease/service/dataset/DataSetTableTaskLogService.java index fe687d4f75..783e564be7 100644 --- a/backend/src/main/java/io/dataease/service/dataset/DataSetTableTaskLogService.java +++ b/backend/src/main/java/io/dataease/service/dataset/DataSetTableTaskLogService.java @@ -48,4 +48,11 @@ public class DataSetTableTaskLogService { return extDataSetTaskMapper.list(request); } + public void deleteByTaskId(String taskId){ + DatasetTableTaskLogExample datasetTableTaskLogExample = new DatasetTableTaskLogExample(); + DatasetTableTaskLogExample.Criteria criteria = datasetTableTaskLogExample.createCriteria(); + criteria.andTaskIdEqualTo(taskId); + datasetTableTaskLogMapper.deleteByExample(datasetTableTaskLogExample); + } + } 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 44d5d0719e..4f54ea0b3e 100644 --- a/backend/src/main/java/io/dataease/service/dataset/DataSetTableTaskService.java +++ b/backend/src/main/java/io/dataease/service/dataset/DataSetTableTaskService.java @@ -20,7 +20,8 @@ import java.util.UUID; public class DataSetTableTaskService { @Resource private DatasetTableTaskMapper datasetTableTaskMapper; - + @Resource + private DataSetTableTaskLogService dataSetTableTaskLogService; @Resource private ScheduleService scheduleService; @@ -46,6 +47,11 @@ public class DataSetTableTaskService { DatasetTableTask datasetTableTask = datasetTableTaskMapper.selectByPrimaryKey(id); datasetTableTaskMapper.deleteByPrimaryKey(id); scheduleService.deleteSchedule(datasetTableTask); + dataSetTableTaskLogService.deleteByTaskId(id); + } + + public DatasetTableTask get(String id) { + return datasetTableTaskMapper.selectByPrimaryKey(id); } public List list(DatasetTableTask datasetTableTask) { diff --git a/backend/src/main/java/io/dataease/service/dataset/ExtractDataService.java b/backend/src/main/java/io/dataease/service/dataset/ExtractDataService.java new file mode 100644 index 0000000000..037fe397d5 --- /dev/null +++ b/backend/src/main/java/io/dataease/service/dataset/ExtractDataService.java @@ -0,0 +1,93 @@ +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.commons.constants.JobStatus; +import io.dataease.commons.utils.CommonBeanFactory; +import io.dataease.dto.dataset.DataTableInfoDTO; +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.util.List; +import java.util.UUID; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +@Service +public class ExtractDataService { + + @Resource + private DataSetTableService dataSetTableService; + @Resource + private DataSetTableFieldsService dataSetTableFieldsService; + @Resource + private DataSetTableTaskLogService dataSetTableTaskLogService; + private Long pageSize = 10000l; + private static ExecutorService pool = Executors.newScheduledThreadPool(50); //设置连接池 + private Connection connection; + + public void extractData(String datasetTableId, String taskId) { + DatasetTableTaskLog datasetTableTaskLog = new DatasetTableTaskLog(); + 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 org.springframework.boot spring-boot-starter-parent - 2.4.3 - + dataease backend + frontend From 1992e84b590ad9ebfb3b29b082825b4f20370357 Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Wed, 10 Mar 2021 18:26:53 +0800 Subject: [PATCH 08/29] =?UTF-8?q?feat:=E7=94=A8=E6=88=B7=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/mapper/ext/ExtSysUserMapper.xml | 11 +- .../sys/request/UserGridRequest.java | 8 + .../business/condition-table/index.vue | 95 ++++ frontend/src/lang/index.js | 9 +- frontend/src/lang/zh.js | 1 + frontend/src/utils/auth.js | 2 + frontend/src/utils/index.js | 14 + frontend/src/utils/permission.js | 9 + frontend/src/utils/validate.js | 2 + frontend/src/views/system/user/index.vue | 247 +++++----- frontend/src/views/system/user/index1.vue | 134 ------ frontend/src/views/system/user/index_back.vue | 444 ++++++++++++++++++ 12 files changed, 709 insertions(+), 267 deletions(-) create mode 100644 frontend/src/components/business/condition-table/index.vue create mode 100644 frontend/src/utils/permission.js delete mode 100644 frontend/src/views/system/user/index1.vue create mode 100644 frontend/src/views/system/user/index_back.vue diff --git a/backend/src/main/java/io/dataease/base/mapper/ext/ExtSysUserMapper.xml b/backend/src/main/java/io/dataease/base/mapper/ext/ExtSysUserMapper.xml index 981982136c..374f4216d7 100644 --- a/backend/src/main/java/io/dataease/base/mapper/ext/ExtSysUserMapper.xml +++ b/backend/src/main/java/io/dataease/base/mapper/ext/ExtSysUserMapper.xml @@ -33,8 +33,17 @@ left join sys_role r on r.role_id = ur.role_id left join sys_dept d on d.dept_id = u.dept_id + + AND u.nick_name like CONCAT('%', #{request.quick},'%') + - AND u.name like CONCAT('%', #{request.name},'%') + AND u.nick_name like CONCAT('%', #{request.name},'%') + + + AND u.enabled = #{request.enabled} + + + AND u.dept_id = #{request.deptId} order by u.update_time desc diff --git a/backend/src/main/java/io/dataease/controller/sys/request/UserGridRequest.java b/backend/src/main/java/io/dataease/controller/sys/request/UserGridRequest.java index 4b325a3c17..55da77bea9 100644 --- a/backend/src/main/java/io/dataease/controller/sys/request/UserGridRequest.java +++ b/backend/src/main/java/io/dataease/controller/sys/request/UserGridRequest.java @@ -1,10 +1,18 @@ package io.dataease.controller.sys.request; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; @Data public class UserGridRequest implements Serializable { + @ApiModelProperty("快速检索") + private String quick; + @ApiModelProperty("名称") private String name; + @ApiModelProperty("组织") + private String deptId; + @ApiModelProperty("状态") + private String enabled; } diff --git a/frontend/src/components/business/condition-table/index.vue b/frontend/src/components/business/condition-table/index.vue new file mode 100644 index 0000000000..f15562ef70 --- /dev/null +++ b/frontend/src/components/business/condition-table/index.vue @@ -0,0 +1,95 @@ + + + + + diff --git a/frontend/src/lang/index.js b/frontend/src/lang/index.js index 4a3b179365..a4cc3d7d19 100644 --- a/frontend/src/lang/index.js +++ b/frontend/src/lang/index.js @@ -11,17 +11,22 @@ import zhLocale from './zh' import twLocale from './tw' import esLocale from './es' import jaLocale from './ja' +import fuZh from 'fit2cloud-ui/src/locale/lang/zh-CN' // 加载fit2cloud的内容 + +import fuEn from 'fit2cloud-ui/src/locale/lang/en_US' // 加载fit2cloud的内容 Vue.use(VueI18n) const messages = { en: { ...enLocale, - ...elementEnLocale + ...elementEnLocale, + ...fuEn }, zh: { ...zhLocale, - ...elementZhLocale + ...elementZhLocale, + ...fuZh }, tw: { ...twLocale, diff --git a/frontend/src/lang/zh.js b/frontend/src/lang/zh.js index feac4aeec0..08f6342a5a 100644 --- a/frontend/src/lang/zh.js +++ b/frontend/src/lang/zh.js @@ -424,6 +424,7 @@ export default { input_email: '请输入邮箱', input_password: '请输入密码', input_phone: '请输入电话号码', + input_roles: '请选择角色', special_characters_are_not_supported: '不支持特殊字符', mobile_number_format_is_incorrect: '手机号码格式不正确', email_format_is_incorrect: '邮箱格式不正确', diff --git a/frontend/src/utils/auth.js b/frontend/src/utils/auth.js index c0663e529e..033e976420 100644 --- a/frontend/src/utils/auth.js +++ b/frontend/src/utils/auth.js @@ -1,5 +1,6 @@ import Cookies from 'js-cookie' import Config from '@/settings' + const TokenKey = Config.TokenKey export function getToken() { @@ -13,3 +14,4 @@ export function setToken(token) { export function removeToken() { return Cookies.remove(TokenKey) } + diff --git a/frontend/src/utils/index.js b/frontend/src/utils/index.js index 61899c6e3a..092535fee8 100644 --- a/frontend/src/utils/index.js +++ b/frontend/src/utils/index.js @@ -136,3 +136,17 @@ export function param2Obj(url) { '"}' ) } + +export function formatCondition(param) { + if (!param) { + return null + } + const condition = {} + for (const key in param) { + if (Object.hasOwnProperty.call(param, key)) { + const element = param[key] + condition[element.field] = element.value + } + } + return condition +} diff --git a/frontend/src/utils/permission.js b/frontend/src/utils/permission.js new file mode 100644 index 0000000000..54be75573a --- /dev/null +++ b/frontend/src/utils/permission.js @@ -0,0 +1,9 @@ +import store from '@/store' +export function checkPermission(pers) { + const permissions = store.getters.permissions + const hasPermission = pers.every(needP => { + const result = permissions.includes(needP) + return result + }) + return hasPermission +} diff --git a/frontend/src/utils/validate.js b/frontend/src/utils/validate.js index 1e5024e641..de31eda81e 100644 --- a/frontend/src/utils/validate.js +++ b/frontend/src/utils/validate.js @@ -18,3 +18,5 @@ export function validUsername(str) { const valid_map = ['admin', 'cyw'] return valid_map.indexOf(str.trim()) >= 0 } + +export const PHONE_REGEX = '^1[3|4|5|7|8][0-9]{9}$' diff --git a/frontend/src/views/system/user/index.vue b/frontend/src/views/system/user/index.vue index fa2b29878c..7c2a6ca953 100644 --- a/frontend/src/views/system/user/index.vue +++ b/frontend/src/views/system/user/index.vue @@ -1,62 +1,44 @@