diff --git a/backend/src/main/java/io/dataease/auth/api/dto/DynamicMenuDto.java b/backend/src/main/java/io/dataease/auth/api/dto/DynamicMenuDto.java index d79a6e6bbd..2121aaf1c7 100644 --- a/backend/src/main/java/io/dataease/auth/api/dto/DynamicMenuDto.java +++ b/backend/src/main/java/io/dataease/auth/api/dto/DynamicMenuDto.java @@ -25,6 +25,8 @@ public class DynamicMenuDto implements Serializable { private String permission; + private Boolean hidden; + private List children; } 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 46b942ef48..719f6db9d9 100644 --- a/backend/src/main/java/io/dataease/auth/config/F2CRealm.java +++ b/backend/src/main/java/io/dataease/auth/config/F2CRealm.java @@ -68,6 +68,9 @@ public class F2CRealm extends AuthorizingRealm { if (user == null) { throw new AuthenticationException("User didn't existed!"); } + if (user.getEnabled()==0) { + throw new AuthenticationException("User is valid!"); + } String pass = null; try { pass = user.getPassword(); 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 6c454034f7..56211cab1d 100644 --- a/backend/src/main/java/io/dataease/auth/server/AuthServer.java +++ b/backend/src/main/java/io/dataease/auth/server/AuthServer.java @@ -35,10 +35,14 @@ public class AuthServer implements AuthApi { String username = loginDto.getUsername(); String password = loginDto.getPassword(); SysUserEntity user = authUserService.getUserByName(username); - String realPwd = user.getPassword(); + if (ObjectUtils.isEmpty(user)){ throw new RuntimeException("没有该用户!"); } + if (user.getEnabled()==0){ + throw new RuntimeException("用户已经失效!"); + } + String realPwd = user.getPassword(); //私钥解密 String pwd = RsaUtil.decryptByPrivateKey(RsaProperties.privateKey, password); //md5加密 diff --git a/backend/src/main/java/io/dataease/auth/service/impl/DynamicMenuServiceImpl.java b/backend/src/main/java/io/dataease/auth/service/impl/DynamicMenuServiceImpl.java index 1d256f478b..3004bf553c 100644 --- a/backend/src/main/java/io/dataease/auth/service/impl/DynamicMenuServiceImpl.java +++ b/backend/src/main/java/io/dataease/auth/service/impl/DynamicMenuServiceImpl.java @@ -42,6 +42,7 @@ public class DynamicMenuServiceImpl implements DynamicMenuService { menuMeta.setIcon(sysMenu.getIcon()); dynamicMenuDto.setMeta(menuMeta); dynamicMenuDto.setPermission(sysMenu.getPermission()); + dynamicMenuDto.setHidden(sysMenu.getHidden()); return dynamicMenuDto; } 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 9b171a936f..8dbed6faf2 100644 --- a/backend/src/main/java/io/dataease/auth/util/JWTUtils.java +++ b/backend/src/main/java/io/dataease/auth/util/JWTUtils.java @@ -13,6 +13,8 @@ import org.apache.commons.lang3.StringUtils; import org.apache.shiro.authc.AuthenticationException; import org.springframework.cache.Cache; import org.springframework.cache.CacheManager; +import org.springframework.core.env.Environment; + import java.util.Date; @@ -22,7 +24,9 @@ public class JWTUtils { // token过期时间1min (过期会自动刷新续命 目的是避免一直都是同一个token ) private static final long EXPIRE_TIME = 1*60*1000; // 登录间隔时间10min 超过这个时间强制重新登录 - private static final long Login_Interval = 10*60*1000; + private static long Login_Interval; + + /** @@ -79,6 +83,11 @@ public class JWTUtils { * @return */ public static boolean loginExpire(String token){ + if (Login_Interval==0) { + String property = CommonBeanFactory.getBean(Environment.class).getProperty("dataease.login_timeout"); + int seconds = StringUtils.isNotEmpty(property) ? Integer.parseInt(property): (10*60); + Login_Interval = seconds * 1000; + } Long now = System.currentTimeMillis(); Long lastOperateTime = tokenLastOperateTime(token); boolean isExpire = false; @@ -169,4 +178,5 @@ public class JWTUtils { long now = System.currentTimeMillis(); tokens_expire.put(token, now); } + } 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 3d491518ba..2a90d706f9 100644 --- a/backend/src/main/java/io/dataease/controller/dataset/DataSetTableController.java +++ b/backend/src/main/java/io/dataease/controller/dataset/DataSetTableController.java @@ -63,9 +63,9 @@ public class DataSetTableController { return dataSetTableService.getData(dataSetTableRequest); } - @PostMapping("getPreviewData") - public Map getPreviewData(@RequestBody DataSetTableRequest dataSetTableRequest) throws Exception { - return dataSetTableService.getPreviewData(dataSetTableRequest); + @PostMapping("getPreviewData/{page}/{pageSize}") + public Map getPreviewData(@RequestBody DataSetTableRequest dataSetTableRequest, @PathVariable Integer page, @PathVariable Integer pageSize) throws Exception { + return dataSetTableService.getPreviewData(dataSetTableRequest, page, pageSize); } @PostMapping("sqlPreview") diff --git a/backend/src/main/java/io/dataease/dto/dataset/DataSetPreviewPage.java b/backend/src/main/java/io/dataease/dto/dataset/DataSetPreviewPage.java new file mode 100644 index 0000000000..18aa7fd859 --- /dev/null +++ b/backend/src/main/java/io/dataease/dto/dataset/DataSetPreviewPage.java @@ -0,0 +1,17 @@ +package io.dataease.dto.dataset; + +import lombok.Getter; +import lombok.Setter; + +/** + * @Author gin + * @Date 2021/4/28 11:13 上午 + */ +@Getter +@Setter +public class DataSetPreviewPage { + private Integer total = 0; + private Integer show = 0; + private Integer page = 1; + private Integer pageSize = 100; +} 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 7e5f034ad0..2941638e8e 100644 --- a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java +++ b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java @@ -14,6 +14,7 @@ import io.dataease.datasource.dto.TableFiled; import io.dataease.datasource.provider.DatasourceProvider; import io.dataease.datasource.provider.ProviderFactory; import io.dataease.datasource.request.DatasourceRequest; +import io.dataease.dto.dataset.DataSetPreviewPage; import io.dataease.dto.dataset.DataTableInfoDTO; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; @@ -34,7 +35,6 @@ import javax.annotation.Resource; import java.io.*; import java.math.BigDecimal; import java.nio.charset.StandardCharsets; -import java.sql.ResultSet; import java.text.MessageFormat; import java.util.*; import java.util.stream.Collectors; @@ -172,7 +172,7 @@ public class DataSetTableService { return datasourceProvider.getData(datasourceRequest); } - public Map getPreviewData(DataSetTableRequest dataSetTableRequest) throws Exception { + public Map getPreviewData(DataSetTableRequest dataSetTableRequest, Integer page, Integer pageSize) throws Exception { DatasetTableField datasetTableField = DatasetTableField.builder().build(); datasetTableField.setTableId(dataSetTableRequest.getId()); datasetTableField.setChecked(Boolean.TRUE); @@ -183,6 +183,14 @@ public class DataSetTableService { DatasetTable datasetTable = datasetTableMapper.selectByPrimaryKey(dataSetTableRequest.getId()); List data = new ArrayList<>(); + DataSetPreviewPage dataSetPreviewPage = new DataSetPreviewPage(); + dataSetPreviewPage.setShow(Integer.valueOf(dataSetTableRequest.getRow())); + dataSetPreviewPage.setPage(page); + dataSetPreviewPage.setPageSize(pageSize); + int realSize = Integer.parseInt(dataSetTableRequest.getRow()) < pageSize ? Integer.parseInt(dataSetTableRequest.getRow()) : pageSize; + if (page == Integer.parseInt(dataSetTableRequest.getRow()) / pageSize + 1) { + realSize = Integer.parseInt(dataSetTableRequest.getRow()) % pageSize; + } if (StringUtils.equalsIgnoreCase(datasetTable.getType(), "db")) { Datasource ds = datasourceMapper.selectByPrimaryKey(dataSetTableRequest.getDataSourceId()); DatasourceProvider datasourceProvider = ProviderFactory.getProvider(ds.getType()); @@ -190,11 +198,18 @@ public class DataSetTableService { datasourceRequest.setDatasource(ds); String table = dataTableInfoDTO.getTable(); - datasourceRequest.setQuery(createQuerySQL(ds.getType(), table, fieldArray) + " LIMIT 0," + dataSetTableRequest.getRow()); + datasourceRequest.setQuery(createQuerySQL(ds.getType(), table, fieldArray) + " LIMIT " + (page - 1) * realSize + "," + realSize); try { data.addAll(datasourceProvider.getData(datasourceRequest)); } catch (Exception e) { + e.printStackTrace(); + } + try { + datasourceRequest.setQuery(createQueryCountSQL(ds.getType(), table)); + dataSetPreviewPage.setTotal(Integer.valueOf(datasourceProvider.getData(datasourceRequest).get(0)[0])); + } catch (Exception e) { + e.printStackTrace(); } } else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), "sql")) { Datasource ds = datasourceMapper.selectByPrimaryKey(dataSetTableRequest.getDataSourceId()); @@ -203,11 +218,18 @@ public class DataSetTableService { datasourceRequest.setDatasource(ds); String sql = dataTableInfoDTO.getSql(); - datasourceRequest.setQuery(createQuerySQL(ds.getType(), " (" + sql + ") AS tmp ", fieldArray) + " LIMIT 0," + dataSetTableRequest.getRow()); + datasourceRequest.setQuery(createQuerySQL(ds.getType(), " (" + sql + ") AS tmp ", fieldArray) + " LIMIT " + (page - 1) * realSize + "," + realSize); try { data.addAll(datasourceProvider.getData(datasourceRequest)); } catch (Exception e) { + e.printStackTrace(); + } + try { + datasourceRequest.setQuery(createQueryCountSQL(ds.getType(), " (" + sql + ") AS tmp ")); + dataSetPreviewPage.setTotal(Integer.valueOf(datasourceProvider.getData(datasourceRequest).get(0)[0])); + } catch (Exception e) { + e.printStackTrace(); } } else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), "excel")) { @@ -229,6 +251,7 @@ public class DataSetTableService { Map map = new HashMap<>(); map.put("fields", fields); map.put("data", jsonArray); + map.put("page", dataSetPreviewPage); return map; } @@ -314,6 +337,18 @@ public class DataSetTableService { } } + public String createQueryCountSQL(String type, String table) { + DatasourceTypes datasourceType = DatasourceTypes.valueOf(type); + switch (datasourceType) { + case mysql: + return MessageFormat.format("SELECT count(*) FROM {0}", table); + case sqlServer: + return MessageFormat.format("SELECT count(*) FROM {0}", table); + default: + return MessageFormat.format("SELECT count(*) FROM {0}", table); + } + } + public String createQuerySQL(String type, String table, String[] fields) { DatasourceTypes datasourceType = DatasourceTypes.valueOf(type); switch (datasourceType) { 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 85ccfc0ef2..096eb96511 100644 --- a/backend/src/main/java/io/dataease/service/sys/SysUserService.java +++ b/backend/src/main/java/io/dataease/service/sys/SysUserService.java @@ -15,12 +15,12 @@ import io.dataease.controller.sys.base.BaseGridRequest; import io.dataease.controller.sys.request.SysUserCreateRequest; import io.dataease.controller.sys.request.SysUserPwdRequest; import io.dataease.controller.sys.request.SysUserStateRequest; -import io.dataease.controller.sys.request.UserGridRequest; import io.dataease.controller.sys.response.SysUserGridResponse; import io.dataease.controller.sys.response.SysUserRole; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; import org.springframework.cache.annotation.CacheEvict; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,7 +31,10 @@ import java.util.stream.Collectors; @Service public class SysUserService { - private final static String DEFAULT_PWD = "DataEase123.."; + //private final static String DEFAULT_PWD = "DataEase123.."; + + @Value("${dataease.init_password:DataEase123..}") + private String DEFAULT_PWD; @Resource private SysUserMapper sysUserMapper; @@ -89,6 +92,7 @@ public class SysUserService { } + @CacheEvict(value = AuthConstants.USER_CACHE_NAME, key = "'user' + #request.userId") public int updateStatus(SysUserStateRequest request){ SysUser sysUser = new SysUser(); sysUser.setUserId(request.getUserId()); diff --git a/backend/src/main/resources/application.properties b/backend/src/main/resources/application.properties index 93567fed38..69f15f7e2a 100644 --- a/backend/src/main/resources/application.properties +++ b/backend/src/main/resources/application.properties @@ -62,6 +62,10 @@ spring.mvc.log-request-details=true pagehelper.PageRowBounds=true #excel等用户上传文件路径 upload.file.path=/opt/dataease/data/upload/ +#用户初始密码,如果不设置默认是DataEase123.. +dataease.init_password=DataEase123456 +#登录超时时间单位s 设置默认30分钟 如果雨不设置 默认10分钟也就是10*60 +dataease.login_timeout=1800 diff --git a/frontend/package.json b/frontend/package.json index dac5d81076..65c1a2ba34 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -22,7 +22,7 @@ "element-resize-detector": "^1.2.2", "element-ui": "2.13.0", "file-saver": "^2.0.5", - "fit2cloud-ui": "^0.1.12", + "fit2cloud-ui": "^1.1.1", "html2canvas": "^1.0.0-rc.7", "js-cookie": "2.2.0", "jsencrypt": "^3.0.0-rc.1", diff --git a/frontend/src/components/back-button/index.vue b/frontend/src/components/back-button/index.vue new file mode 100644 index 0000000000..6d72ad6009 --- /dev/null +++ b/frontend/src/components/back-button/index.vue @@ -0,0 +1,46 @@ + + + + + diff --git a/frontend/src/components/business/LayoutContent.vue b/frontend/src/components/business/LayoutContent.vue index daabdb6ee3..b1365a2d95 100644 --- a/frontend/src/components/business/LayoutContent.vue +++ b/frontend/src/components/business/LayoutContent.vue @@ -1,17 +1,45 @@ diff --git a/frontend/src/components/business/complex-table/index.vue b/frontend/src/components/business/complex-table/index.vue index fe330ee3a0..9c625a4edb 100644 --- a/frontend/src/components/business/complex-table/index.vue +++ b/frontend/src/components/business/complex-table/index.vue @@ -1,3 +1,4 @@ +