diff --git a/backend/src/main/java/io/dataease/auth/entity/AccountLockStatus.java b/backend/src/main/java/io/dataease/auth/entity/AccountLockStatus.java index 8555d2c381..cc37ef3cb4 100644 --- a/backend/src/main/java/io/dataease/auth/entity/AccountLockStatus.java +++ b/backend/src/main/java/io/dataease/auth/entity/AccountLockStatus.java @@ -12,4 +12,6 @@ public class AccountLockStatus { private Long unlockTime; private Integer relieveTimes; + + private Integer remainderTimes; } 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 4455484c75..44fe78b13e 100644 --- a/backend/src/main/java/io/dataease/auth/server/AuthServer.java +++ b/backend/src/main/java/io/dataease/auth/server/AuthServer.java @@ -81,8 +81,8 @@ public class AuthServer implements AuthApi { ValidateResult validateResult = ldapXpackService.login(request); if (!validateResult.isSuccess()) { - authUserService.recordLoginFail(username, 1); - DataEaseException.throwException(validateResult.getMsg()); + AccountLockStatus lockStatus = authUserService.recordLoginFail(username, 1); + DataEaseException.throwException(appendLoginErrorMsg(validateResult.getMsg(), lockStatus)); } XpackLdapUserEntity ldapUserEntity = validateResult.getData(); if (StringUtils.isBlank(ldapUserEntity.getEmail())) { @@ -120,19 +120,19 @@ public class AuthServer implements AuthApi { SysUserEntity user = authUserService.getUserByName(username); if (ObjectUtils.isEmpty(user)) { - authUserService.recordLoginFail(username, 0); - DataEaseException.throwException(Translator.get("i18n_user_do_not_exist")); + AccountLockStatus lockStatus = authUserService.recordLoginFail(username, 0); + DataEaseException.throwException(appendLoginErrorMsg(Translator.get("i18n_id_or_pwd_error"), lockStatus)); } // 验证登录类型是否与用户类型相同 if (!sysUserService.validateLoginType(user.getFrom(), loginType)) { - authUserService.recordLoginFail(username, 0); - DataEaseException.throwException(Translator.get("i18n_login_type_error")); + AccountLockStatus lockStatus = authUserService.recordLoginFail(username, 0); + DataEaseException.throwException(appendLoginErrorMsg(Translator.get("i18n_login_type_error"), lockStatus)); } if (user.getEnabled() == 0) { - authUserService.recordLoginFail(username, 0); - DataEaseException.throwException(Translator.get("i18n_user_is_disable")); + AccountLockStatus lockStatus = authUserService.recordLoginFail(username, 0); + DataEaseException.throwException(appendLoginErrorMsg(Translator.get("i18n_user_is_disable"), lockStatus)); } String realPwd = user.getPassword(); @@ -144,8 +144,8 @@ public class AuthServer implements AuthApi { pwd = CodingUtil.md5(pwd); if (!StringUtils.equals(pwd, realPwd)) { - authUserService.recordLoginFail(username, 0); - DataEaseException.throwException(Translator.get("i18n_id_or_pwd_error")); + AccountLockStatus lockStatus = authUserService.recordLoginFail(username, 0); + DataEaseException.throwException(appendLoginErrorMsg(Translator.get("i18n_id_or_pwd_error"), lockStatus)); } } @@ -161,6 +161,15 @@ public class AuthServer implements AuthApi { return result; } + private String appendLoginErrorMsg(String msg, AccountLockStatus lockStatus) { + if (ObjectUtils.isEmpty(lockStatus)) return msg; + if (ObjectUtils.isNotEmpty(lockStatus.getRemainderTimes())) { + String i18n = Translator.get("i18n_login_remainder_times"); + msg += String.format(i18n, lockStatus.getRemainderTimes()); + } + return msg; + } + @Override public CurrentUserDto userInfo() { CurrentUserDto userDto = (CurrentUserDto) SecurityUtils.getSubject().getPrincipal(); 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 e8704f5dc5..6db8a61695 100644 --- a/backend/src/main/java/io/dataease/auth/service/AuthUserService.java +++ b/backend/src/main/java/io/dataease/auth/service/AuthUserService.java @@ -55,7 +55,7 @@ public interface AuthUserService { void checkAdmin(String uname, String pwd); - void recordLoginFail(String username, Integer logintype); + AccountLockStatus recordLoginFail(String username, Integer logintype); void unlockAccount(String username, Integer logintype); 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 f5329eb743..c65ef79ab6 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 @@ -277,14 +277,16 @@ public class AuthUserServiceImpl implements AuthUserService { } @Override - public void recordLoginFail(String username, Integer logintype) { - if (!supportLoginLimit()) return; + public AccountLockStatus recordLoginFail(String username, Integer logintype) { + if (!supportLoginLimit()) return null; long now = System.currentTimeMillis(); SysLoginLimit sysLoginLimit = new SysLoginLimit(); sysLoginLimit.setUsername(username); sysLoginLimit.setLoginType(logintype); sysLoginLimit.setRecordTime(now); sysLoginLimitMapper.insert(sysLoginLimit); + return lockStatus(username, logintype); + } @Override @@ -312,13 +314,16 @@ public class AuthUserServiceImpl implements AuthUserService { SysLoginLimitExample example = new SysLoginLimitExample(); example.createCriteria().andUsernameEqualTo(username).andLoginTypeEqualTo(logintype).andRecordTimeGreaterThan(dividingPointTime); List sysLoginLimits = sysLoginLimitMapper.selectByExample(example); + accountLockStatus.setRemainderTimes(limitTimes); if (CollectionUtils.isNotEmpty(sysLoginLimits)) { boolean needLock = sysLoginLimits.size() >= limitTimes; + accountLockStatus.setRemainderTimes(limitTimes - sysLoginLimits.size()); accountLockStatus.setLocked(needLock); if (needLock) { long unlockTime = now + (longRelieveTimes * 60L * 1000L); accountLockStatus.setUnlockTime(unlockTime); accountLockStatus.setRelieveTimes(relieveTimes); + accountLockStatus.setRemainderTimes(0); } } diff --git a/backend/src/main/java/io/dataease/provider/engine/doris/DorisQueryProvider.java b/backend/src/main/java/io/dataease/provider/engine/doris/DorisQueryProvider.java index 41de90d9c6..d7963002c6 100644 --- a/backend/src/main/java/io/dataease/provider/engine/doris/DorisQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/engine/doris/DorisQueryProvider.java @@ -364,10 +364,11 @@ public class DorisQueryProvider extends QueryProvider { @Override public String getSQLWithPage(boolean isTable, String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view, PageInfo pageInfo) { + String limit = ((pageInfo.getGoPage() != null && pageInfo.getPageSize() != null) ? " LIMIT " + (pageInfo.getGoPage() - 1) * pageInfo.getPageSize() + "," + pageInfo.getPageSize() : ""); if (isTable) { - return originalTableInfo(table, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view) + " LIMIT " + (pageInfo.getGoPage() - 1) * pageInfo.getPageSize() + "," + pageInfo.getPageSize(); + return originalTableInfo(table, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view) + limit; } else { - return originalTableInfo("(" + sqlFix(table) + ")", xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view) + " LIMIT " + (pageInfo.getGoPage() - 1) * pageInfo.getPageSize() + "," + pageInfo.getPageSize(); + return originalTableInfo("(" + sqlFix(table) + ")", xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view) + limit; } } diff --git a/backend/src/main/java/io/dataease/provider/engine/mysql/MysqlQueryProvider.java b/backend/src/main/java/io/dataease/provider/engine/mysql/MysqlQueryProvider.java index 29888495af..e072cba02a 100644 --- a/backend/src/main/java/io/dataease/provider/engine/mysql/MysqlQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/engine/mysql/MysqlQueryProvider.java @@ -364,10 +364,11 @@ public class MysqlQueryProvider extends QueryProvider { @Override public String getSQLWithPage(boolean isTable, String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view, PageInfo pageInfo) { + String limit = ((pageInfo.getGoPage() != null && pageInfo.getPageSize() != null) ? " LIMIT " + (pageInfo.getGoPage() - 1) * pageInfo.getPageSize() + "," + pageInfo.getPageSize() : ""); if (isTable) { - return originalTableInfo(table, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view) + " LIMIT " + (pageInfo.getGoPage() - 1) * pageInfo.getPageSize() + "," + pageInfo.getPageSize(); + return originalTableInfo(table, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view) + limit; } else { - return originalTableInfo("(" + sqlFix(table) + ")", xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view) + " LIMIT " + (pageInfo.getGoPage() - 1) * pageInfo.getPageSize() + "," + pageInfo.getPageSize(); + return originalTableInfo("(" + sqlFix(table) + ")", xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view) + limit; } } diff --git a/backend/src/main/java/io/dataease/provider/query/mysql/MysqlQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/mysql/MysqlQueryProvider.java index a990aed009..25cc5c4a04 100644 --- a/backend/src/main/java/io/dataease/provider/query/mysql/MysqlQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/mysql/MysqlQueryProvider.java @@ -381,10 +381,11 @@ public class MysqlQueryProvider extends QueryProvider { @Override public String getSQLWithPage(boolean isTable, String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view, PageInfo pageInfo) { - if(isTable){ - return originalTableInfo(table, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view) + " LIMIT " + (pageInfo.getGoPage() - 1) * pageInfo.getPageSize() + "," + pageInfo.getPageSize(); - }else { - return originalTableInfo("(" + sqlFix(table) + ")", xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view) + " LIMIT " + (pageInfo.getGoPage() - 1) * pageInfo.getPageSize() + "," + pageInfo.getPageSize(); + String limit = ((pageInfo.getGoPage() != null && pageInfo.getPageSize() != null) ? " LIMIT " + (pageInfo.getGoPage() - 1) * pageInfo.getPageSize() + "," + pageInfo.getPageSize() : ""); + if (isTable) { + return originalTableInfo(table, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view) + limit; + } else { + return originalTableInfo("(" + sqlFix(table) + ")", xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view) + limit; } } diff --git a/backend/src/main/java/io/dataease/service/chart/util/ChartDataBuild.java b/backend/src/main/java/io/dataease/service/chart/util/ChartDataBuild.java index 2e50a71a12..71e32cb73f 100644 --- a/backend/src/main/java/io/dataease/service/chart/util/ChartDataBuild.java +++ b/backend/src/main/java/io/dataease/service/chart/util/ChartDataBuild.java @@ -1011,7 +1011,7 @@ public class ChartDataBuild { } else { switch (columnPermissionItem.getDesensitizationRule().getCustomBuiltInRule()) { case RetainBeforeMAndAfterN: - if (StringUtils.isEmpty(originStr) || originStr.length() < columnPermissionItem.getDesensitizationRule().getM() + columnPermissionItem.getDesensitizationRule().getN() + 1) { + if (StringUtils.isEmpty(originStr) || originStr.length() <= columnPermissionItem.getDesensitizationRule().getM() + columnPermissionItem.getDesensitizationRule().getN() + 1) { desensitizationStr = String.join("", Collections.nCopies(columnPermissionItem.getDesensitizationRule().getM(), "X")) + "***" + String.join("", Collections.nCopies(columnPermissionItem.getDesensitizationRule().getN(), "X")); } else { desensitizationStr = StringUtils.substring(originStr, 0, columnPermissionItem.getDesensitizationRule().getM() - 1) + "***" + StringUtils.substring(originStr, originStr.length() - columnPermissionItem.getDesensitizationRule().getN(), originStr.length() - 1); diff --git a/backend/src/main/java/io/dataease/service/dataset/PermissionService.java b/backend/src/main/java/io/dataease/service/dataset/PermissionService.java index add7270d39..77fba010d0 100644 --- a/backend/src/main/java/io/dataease/service/dataset/PermissionService.java +++ b/backend/src/main/java/io/dataease/service/dataset/PermissionService.java @@ -13,6 +13,7 @@ import io.dataease.plugins.common.dto.chart.ChartCustomFilterItemDTO; import io.dataease.plugins.common.dto.chart.ChartFieldCustomFilterDTO; import io.dataease.plugins.config.SpringContextUtil; import io.dataease.plugins.xpack.auth.dto.request.*; +import io.dataease.plugins.xpack.auth.dto.response.Item; import io.dataease.plugins.xpack.auth.service.ColumnPermissionService; import io.dataease.plugins.xpack.auth.service.RowPermissionService; import org.apache.commons.collections4.CollectionUtils; @@ -112,14 +113,14 @@ public class PermissionService { } if (CollectionUtils.isNotEmpty(fieldRoleColumnPermissionItems)) { if (fieldRoleColumnPermissionItems.stream().map(ColumnPermissionItem::getOpt).collect(Collectors.toList()).contains(ColumnPermissionConstants.Desensitization)) { - desensitizationList.put(field.getDataeaseName(), fieldUserColumnPermissionItems.get(0)); + desensitizationList.put(field.getDataeaseName(), fieldRoleColumnPermissionItems.get(0)); result.add(field); } return; } if (CollectionUtils.isNotEmpty(fieldDeptColumnPermissionItems)) { if (fieldDeptColumnPermissionItems.stream().map(ColumnPermissionItem::getOpt).collect(Collectors.toList()).contains(ColumnPermissionConstants.Desensitization)) { - desensitizationList.put(field.getDataeaseName(), fieldUserColumnPermissionItems.get(0)); + desensitizationList.put(field.getDataeaseName(), fieldDeptColumnPermissionItems.get(0)); result.add(field); } return; @@ -209,34 +210,46 @@ public class PermissionService { dataSetColumnPermissionsDTO.setAuthTargetType("user"); datasetColumnPermissions.addAll(columnPermissionService.searchPermissions(dataSetColumnPermissionsDTO)); if (CollectionUtils.isNotEmpty(roleIds)) { - dataSetColumnPermissionsDTO.setAuthTargetIds(roleIds); - dataSetColumnPermissionsDTO.setAuthTargetType("role"); - List roleColumnPermissionsDTOS = new ArrayList<>(); - for (DataSetColumnPermissionsDTO columnPermissionsDTO : columnPermissionService.searchPermissions(dataSetColumnPermissionsDTO)) { - columnPermissionsDTO.getWhiteListUser(); - List userIdList = new Gson().fromJson(columnPermissionsDTO.getWhiteListUser(), new TypeToken>() { - }.getType()); - if (CollectionUtils.isEmpty(userIdList) || !userIdList.contains(userId)) { - roleColumnPermissionsDTOS.add(columnPermissionsDTO); + DataSetColumnPermissionsDTO request = new DataSetColumnPermissionsDTO(); + request.setDatasetId(datasetId); + request.setAuthTargetType("role"); + List items = (List)columnPermissionService.authObjs(request); + roleIds = roleIds.stream().filter(id -> {return items.stream().map(Item::getId).collect(Collectors.toList()).contains(id);}).collect(Collectors.toList()); + if(CollectionUtils.isNotEmpty(roleIds)){ + dataSetColumnPermissionsDTO.setAuthTargetIds(roleIds); + dataSetColumnPermissionsDTO.setAuthTargetType("role"); + List roleColumnPermissionsDTOS = new ArrayList<>(); + for (DataSetColumnPermissionsDTO columnPermissionsDTO : columnPermissionService.searchPermissions(dataSetColumnPermissionsDTO)) { + columnPermissionsDTO.getWhiteListUser(); + List userIdList = new Gson().fromJson(columnPermissionsDTO.getWhiteListUser(), new TypeToken>() { + }.getType()); + if (CollectionUtils.isEmpty(userIdList) || !userIdList.contains(userId)) { + roleColumnPermissionsDTOS.add(columnPermissionsDTO); + } } + datasetColumnPermissions.addAll(roleColumnPermissionsDTOS); } - datasetColumnPermissions.addAll(roleColumnPermissionsDTOS); } if (deptId != null) { - dataSetColumnPermissionsDTO.setAuthTargetIds(Collections.singletonList(deptId)); - dataSetColumnPermissionsDTO.setAuthTargetType("dept"); - List deptColumnPermissionsDTOS = new ArrayList<>(); - for (DataSetColumnPermissionsDTO columnPermissionsDTO : columnPermissionService.searchPermissions(dataSetColumnPermissionsDTO)) { - List userIdList = new Gson().fromJson(columnPermissionsDTO.getWhiteListUser(), new TypeToken>() { - }.getType()); - if (CollectionUtils.isEmpty(userIdList) || !userIdList.contains(userId)) { - deptColumnPermissionsDTOS.add(columnPermissionsDTO); + DataSetColumnPermissionsDTO request = new DataSetColumnPermissionsDTO(); + request.setDatasetId(datasetId); + request.setAuthTargetType("dept"); + List items = (List)columnPermissionService.authObjs(request); + if(items.stream().map(Item::getId).collect(Collectors.toList()).contains(deptId)){ + dataSetColumnPermissionsDTO.setAuthTargetIds(Collections.singletonList(deptId)); + dataSetColumnPermissionsDTO.setAuthTargetType("dept"); + List deptColumnPermissionsDTOS = new ArrayList<>(); + for (DataSetColumnPermissionsDTO columnPermissionsDTO : columnPermissionService.searchPermissions(dataSetColumnPermissionsDTO)) { + List userIdList = new Gson().fromJson(columnPermissionsDTO.getWhiteListUser(), new TypeToken>() { + }.getType()); + if (CollectionUtils.isEmpty(userIdList) || !userIdList.contains(userId)) { + deptColumnPermissionsDTOS.add(columnPermissionsDTO); + } } + datasetColumnPermissions.addAll(deptColumnPermissionsDTOS); } - datasetColumnPermissions.addAll(deptColumnPermissionsDTOS); } - return datasetColumnPermissions; } diff --git a/backend/src/main/resources/application.properties b/backend/src/main/resources/application.properties index bc8f5acbb8..e2095991b5 100644 --- a/backend/src/main/resources/application.properties +++ b/backend/src/main/resources/application.properties @@ -73,28 +73,7 @@ dataease.sqlinjection.whitelists=/dataset/table/sqlPreview,/dataset/table/update server.compression.enabled=true server.compression.mime-types=application/javascript,text/css,application/json,application/xml,text/html,text/xml,text/plain server.compression.min-response-size=1024 -#\u4E0B\u9762\u7684\u914D\u7F6E\u65B0\u589E\u5230/opt/dataease/conf/dataease/properties -#\u7F13\u5B58\u7C7B\u578B -##spring.cache.type=redis -#spring.cache.type=ehcache -#redis\u516C\u5171\u914D\u7F6E -#spring.redis.timeout=10000 -#spring.redis.lettuce.pool.max-active=8 -#spring.redis.lettuce.pool.max-wait=-1 -#spring.redis.lettuce.pool.max-idle=8 -#\u5355\u673A\u6A21\u5F0Fredis\u914D\u7F6E -#spring.redis.database=0 -#spring.redis.host=192.168.0.110 -#spring.redis.port=6379 -#spring.redis.password=DataEase_ZNB@REDIS -#\u54E8\u5175\u6A21\u5F0Fredis\u914D\u7F6E -#spring.redis.sentinel.master=mymaster -#spring.redis.sentinel.nodes=192.168.0.110:26379,192.168.0.110:26380,192.168.0.110:26381 -#spring.redis.sentinel.password= -#cluster\u6A21\u5F0Fredis\u914D\u7F6E -#spring.redis.cluster.nodes=192.168.0.110:7001,192.168.0.110:7002,192.168.0.110:7003,192.168.0.110:7004,192.168.0.110:7005,192.168.0.110:7006 -#spring.redis.cluster.max-redirects=3 -#spring.redis.password=DataEase_ZNB@REDIS + server.servlet.context-parameters.configurationStrategy=SYSTEM_PROPERTIES server.servlet.session.cookie.http-only=true server.servlet.session.tracking-modes=cookie diff --git a/backend/src/main/resources/i18n/messages_en_US.properties b/backend/src/main/resources/i18n/messages_en_US.properties index 951dca55a6..44b053e949 100644 --- a/backend/src/main/resources/i18n/messages_en_US.properties +++ b/backend/src/main/resources/i18n/messages_en_US.properties @@ -75,6 +75,7 @@ i18n_sql_not_empty=SQL can not be empty. i18n_datasource_not_allow_delete_msg=datasets are using this data source and cannot be deleted i18n_task_name_repeat=Name is used in same data set i18n_id_or_pwd_error=Invalid ID or password +i18n_login_remainder_times=(You can still enter %s times) i18n_user_do_not_exist=User do not exist i18n_user_is_disable=User is disabled i18n_login_type_error=Login type error diff --git a/backend/src/main/resources/i18n/messages_zh_CN.properties b/backend/src/main/resources/i18n/messages_zh_CN.properties index 6ec5cc2064..d51c0e69cf 100644 --- a/backend/src/main/resources/i18n/messages_zh_CN.properties +++ b/backend/src/main/resources/i18n/messages_zh_CN.properties @@ -75,6 +75,7 @@ i18n_sql_not_empty=SQL \u4E0D\u80FD\u4E3A\u7A7A i18n_datasource_not_allow_delete_msg=\u4E2A\u6570\u636E\u96C6\u6B63\u5728\u4F7F\u7528\u6B64\u6570\u636E\u6E90\uFF0C\u65E0\u6CD5\u5220\u9664 i18n_task_name_repeat=\u540C\u4E00\u6570\u636E\u96C6\u4E0B\u4EFB\u52A1\u540D\u79F0\u5DF2\u88AB\u4F7F\u7528 i18n_id_or_pwd_error=\u65E0\u6548\u7684ID\u6216\u5BC6\u7801 +i18n_login_remainder_times=(\u8FD8\u80FD\u8F93\u5165%s\u6B21) i18n_user_do_not_exist=\u7528\u6237\u4E0D\u5B58\u5728 i18n_user_is_disable=\u7528\u6237\u72B6\u6001\u65E0\u6548 i18n_login_type_error=\u767B\u5F55\u65B9\u5F0F\u9519\u8BEF diff --git a/backend/src/main/resources/i18n/messages_zh_TW.properties b/backend/src/main/resources/i18n/messages_zh_TW.properties index 0f0c6d30f2..37072949cb 100644 --- a/backend/src/main/resources/i18n/messages_zh_TW.properties +++ b/backend/src/main/resources/i18n/messages_zh_TW.properties @@ -75,6 +75,7 @@ i18n_sql_not_empty=SQL \u4E0D\u80FD\u70BA\u7A7A i18n_datasource_not_allow_delete_msg=\u500B\u6578\u64DA\u96C6\u6B63\u5728\u4F7F\u7528\u6B64\u6578\u64DA\u6E90\uFF0C\u7121\u6CD5\u522A\u9664 i18n_task_name_repeat=\u540C\u4E00\u6578\u64DA\u96C6\u4E0B\u4EFB\u52D9\u540D\u7A31\u5DF2\u88AB\u4F7F\u7528 i18n_id_or_pwd_error=\u7121\u6548\u7684ID\u6216\u5BC6\u78BC +i18n_login_remainder_times=(\u9084\u80FD\u8F38\u5165%s\u6B21) i18n_user_do_not_exist=\u7528\u6236\u4E0D\u5B58\u5728 i18n_user_is_disable=\u7528\u6236\u72C0\u614B\u7121\u6548 i18n_login_type_error=\u767B\u9304\u65B9\u5F0F\u932F\u8AA4 diff --git a/frontend/src/views/dataset/data/UpdateInfo.vue b/frontend/src/views/dataset/data/UpdateInfo.vue index a44ebedf1f..fc9075b9d7 100644 --- a/frontend/src/views/dataset/data/UpdateInfo.vue +++ b/frontend/src/views/dataset/data/UpdateInfo.vue @@ -136,7 +136,7 @@ key="__operation" :label="$t('commons.operating')" fixed="right" - min-width="100" + min-width="180" >