diff --git a/core/backend/src/main/java/io/dataease/auth/service/impl/AuthUserServiceImpl.java b/core/backend/src/main/java/io/dataease/auth/service/impl/AuthUserServiceImpl.java index c65ef79ab6..7d91965883 100644 --- a/core/backend/src/main/java/io/dataease/auth/service/impl/AuthUserServiceImpl.java +++ b/core/backend/src/main/java/io/dataease/auth/service/impl/AuthUserServiceImpl.java @@ -3,13 +3,13 @@ package io.dataease.auth.service.impl; import io.dataease.auth.api.dto.CurrentRoleDto; import io.dataease.auth.entity.AccountLockStatus; import io.dataease.auth.entity.SysUserEntity; -import io.dataease.commons.constants.ParamConstants; -import io.dataease.commons.utils.CodingUtil; -import io.dataease.exception.DataEaseException; -import io.dataease.ext.*; import io.dataease.auth.service.AuthUserService; import io.dataease.commons.constants.AuthConstants; +import io.dataease.commons.constants.ParamConstants; +import io.dataease.commons.utils.CodingUtil; import io.dataease.commons.utils.LogUtil; +import io.dataease.exception.DataEaseException; +import io.dataease.ext.AuthMapper; import io.dataease.i18n.Translator; import io.dataease.plugins.common.base.domain.SysLoginLimit; import io.dataease.plugins.common.base.domain.SysLoginLimitExample; @@ -27,8 +27,9 @@ import io.dataease.plugins.xpack.ldap.service.LdapXpackService; import io.dataease.plugins.xpack.loginlimit.dto.response.LoginLimitInfo; import io.dataease.plugins.xpack.loginlimit.service.LoginLimitXpackService; import io.dataease.plugins.xpack.oidc.service.OidcXpackService; - import io.dataease.plugins.xpack.wecom.service.WecomXpackService; +import io.dataease.service.sys.SysUserService; +import io.dataease.service.system.EmailService; import io.dataease.service.system.SystemParameterService; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; @@ -36,6 +37,7 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.cache.annotation.Caching; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -45,6 +47,8 @@ import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; +import static io.dataease.commons.constants.ParamConstants.BASIC.LOCKED_EMAIL; + @Service public class AuthUserServiceImpl implements AuthUserService { @@ -62,6 +66,14 @@ public class AuthUserServiceImpl implements AuthUserService { @Resource private SystemParameterService systemParameterService; + @Resource + private EmailService emailService; + + @Lazy + @Resource + private SysUserService sysUserService; + + /** * 此处需被F2CRealm登录认证调用 也就是说每次请求都会被调用 所以最好加上缓存 * @@ -285,10 +297,30 @@ public class AuthUserServiceImpl implements AuthUserService { sysLoginLimit.setLoginType(logintype); sysLoginLimit.setRecordTime(now); sysLoginLimitMapper.insert(sysLoginLimit); - return lockStatus(username, logintype); + AccountLockStatus accountLockStatus = lockStatus(username, logintype); + if (ObjectUtils.isNotEmpty(accountLockStatus) && accountLockStatus.getLocked()) { + sendLockedEmail(username); + } + return accountLockStatus; } + public void sendLockedEmail(String username) { + String value = systemParameterService.getValue(LOCKED_EMAIL.getValue()); + if (StringUtils.isNotBlank(value) && StringUtils.equals("true", value)) { + String email = sysUserService.adminEmail(); + if (StringUtils.isBlank(email)) return; + String format = "账号【%s】登录失败次数过多,已被锁定!"; + String content = String.format(format, username); + try { + emailService.send(email, "账号锁定通知", content); + } catch (Exception e) { + LogUtil.error(e.getMessage(), e); + systemParameterService.disabledLockedEmail(); + } + } + } + @Override public void unlockAccount(String username, Integer logintype) { SysLoginLimitExample example = new SysLoginLimitExample(); diff --git a/core/backend/src/main/java/io/dataease/commons/constants/ParamConstants.java b/core/backend/src/main/java/io/dataease/commons/constants/ParamConstants.java index 7c67ca446a..556aa7fab4 100644 --- a/core/backend/src/main/java/io/dataease/commons/constants/ParamConstants.java +++ b/core/backend/src/main/java/io/dataease/commons/constants/ParamConstants.java @@ -125,6 +125,7 @@ public interface ParamConstants { LOGIN_LIMIT_RELIEVETIMES("loginlimit.relieveTimes"), LOGIN_LIMIT_OPEN("loginlimit.open"), + LOCKED_EMAIL("loginlimit.lockedEmail"), SCAN_CREATE_USER("loginlimit.scanCreateUser"), diff --git a/core/backend/src/main/java/io/dataease/controller/request/panel/PanelTemplateRequest.java b/core/backend/src/main/java/io/dataease/controller/request/panel/PanelTemplateRequest.java index a58c0b0cf0..3892448bf1 100644 --- a/core/backend/src/main/java/io/dataease/controller/request/panel/PanelTemplateRequest.java +++ b/core/backend/src/main/java/io/dataease/controller/request/panel/PanelTemplateRequest.java @@ -14,7 +14,7 @@ public class PanelTemplateRequest extends PanelTemplateWithBLOBs { @ApiModelProperty("排序") private String sort; @ApiModelProperty("详细信息") - private String withBlobs="Y"; + private String withBlobs="N"; @ApiModelProperty("操作类型") private String optType; @ApiModelProperty("静态文件") diff --git a/core/backend/src/main/java/io/dataease/controller/sys/SystemParameterController.java b/core/backend/src/main/java/io/dataease/controller/sys/SystemParameterController.java index 63d59752b4..29d0a29450 100644 --- a/core/backend/src/main/java/io/dataease/controller/sys/SystemParameterController.java +++ b/core/backend/src/main/java/io/dataease/controller/sys/SystemParameterController.java @@ -1,29 +1,34 @@ package io.dataease.controller.sys; -import io.dataease.plugins.common.base.domain.SystemParameter; import io.dataease.commons.constants.ParamConstants; +import io.dataease.commons.utils.LogUtil; +import io.dataease.controller.ResultHolder; import io.dataease.controller.sys.response.BasicInfo; import io.dataease.controller.sys.response.MailInfo; import io.dataease.dto.SystemParameterDTO; import io.dataease.listener.DatasetCheckListener; import io.dataease.listener.util.CacheUtils; +import io.dataease.plugins.common.base.domain.SystemParameter; import io.dataease.plugins.common.util.GlobalFileUtil; import io.dataease.plugins.xpack.cas.dto.CasSaveResult; import io.dataease.service.FileService; +import io.dataease.service.sys.SysUserService; import io.dataease.service.system.EmailService; import io.dataease.service.system.SystemParameterService; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.core.io.ByteArrayResource; -import org.springframework.http.*; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import springfox.documentation.annotations.ApiIgnore; import javax.annotation.Resource; import java.io.IOException; - import java.net.URLDecoder; import java.util.HashMap; import java.util.List; @@ -42,6 +47,23 @@ public class SystemParameterController { @Resource private EmailService emailService; + @Resource + private SysUserService sysUserService; + + @PostMapping("/email/checkAdmin") + public ResultHolder checkAdminEmail() { + String email = sysUserService.adminEmail(); + if (StringUtils.isBlank(email)) { + return ResultHolder.error("管理员邮箱地址为空,请尽快配置"); + } + try { + emailService.testConnection(email); + } catch (Exception e) { + LogUtil.error(e.getMessage(), e); + return ResultHolder.error(e.getMessage()); + } + return ResultHolder.success(true); + } @RequiresPermissions("sysparam:read") @GetMapping("/mail/info") diff --git a/core/backend/src/main/java/io/dataease/ext/ExtPanelTemplateMapper.xml b/core/backend/src/main/java/io/dataease/ext/ExtPanelTemplateMapper.xml index 2cb4dbc70b..531e8e955e 100644 --- a/core/backend/src/main/java/io/dataease/ext/ExtPanelTemplateMapper.xml +++ b/core/backend/src/main/java/io/dataease/ext/ExtPanelTemplateMapper.xml @@ -9,10 +9,10 @@ - panel_template.id, panel_template.`name`, panel_template.pid, panel_template.`level`, panel_template.node_type, panel_template.create_by, panel_template.create_time, panel_template.template_type + panel_template.id, panel_template.`name`, panel_template.pid, panel_template.`level`, panel_template.node_type, panel_template.create_by, panel_template.create_time, panel_template.template_type, panel_template.snapshot - panel_template.snapshot, panel_template.template_style, panel_template.template_data, panel_template.dynamic_data + panel_template.template_style, panel_template.template_data, panel_template.dynamic_data SELECT DISTINCT u.*, @@ -41,20 +41,20 @@ d.NAME AS dept_name FROM ( - select * from sys_user - - where - nick_name like concat('%', #{extendCondition} , '%') - or - email like concat('%', #{extendCondition} , '%') - + select * from sys_user + + where + nick_name like concat('%', #{extendCondition} , '%') + or + email like concat('%', #{extendCondition} , '%') + ) u LEFT JOIN sys_dept d ON d.dept_id = u.dept_id LEFT JOIN sys_users_roles sur ON sur.user_id = u.user_id LEFT JOIN sys_role r ON r.role_id = sur.role_id - + order by ${orderByClause} @@ -67,11 +67,19 @@ + + diff --git a/core/backend/src/main/java/io/dataease/provider/engine/doris/DorisQueryProvider.java b/core/backend/src/main/java/io/dataease/provider/engine/doris/DorisQueryProvider.java index 6db85d3ce8..b68fb346ac 100644 --- a/core/backend/src/main/java/io/dataease/provider/engine/doris/DorisQueryProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/engine/doris/DorisQueryProvider.java @@ -1186,6 +1186,8 @@ public class DorisQueryProvider extends QueryProvider { return "%Y" + split + "%m" + split + "%d"; case "H_m_s": return "%H:%i:%S"; + case "y_M_d_H": + return "%Y" + split + "%m" + split + "%d" + " %H"; case "y_M_d_H_m": return "%Y" + split + "%m" + split + "%d" + " %H:%i"; case "y_M_d_H_m_s": diff --git a/core/backend/src/main/java/io/dataease/provider/engine/mysql/MysqlQueryProvider.java b/core/backend/src/main/java/io/dataease/provider/engine/mysql/MysqlQueryProvider.java index 3f1b4df0c4..6c459d49e8 100644 --- a/core/backend/src/main/java/io/dataease/provider/engine/mysql/MysqlQueryProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/engine/mysql/MysqlQueryProvider.java @@ -1064,16 +1064,16 @@ public class MysqlQueryProvider extends QueryProvider { String format = transDateFormat(request.getDateStyle(), request.getDatePattern()); if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5 || field.getDeExtractType() == 1) { String date = String.format(MySQLConstants.STR_TO_DATE, originName, StringUtils.isNotEmpty(field.getDateFormat()) ? field.getDateFormat() : MysqlConstants.DEFAULT_DATE_FORMAT); - if(request.getOperator().equals("between")){ + if (request.getOperator().equals("between")) { whereName = date; - }else { + } else { whereName = String.format(MySQLConstants.DATE_FORMAT, date, format); } } if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { - if(request.getOperator().equals("between")){ + if (request.getOperator().equals("between")) { whereName = originName; - }else { + } else { String cast = String.format(MySQLConstants.CAST, originName, MySQLConstants.DEFAULT_INT_FORMAT) + "/1000"; whereName = String.format(DorisConstants.FROM_UNIXTIME, cast, format); } @@ -1166,6 +1166,8 @@ public class MysqlQueryProvider extends QueryProvider { return "%Y" + split + "%m" + split + "%d"; case "H_m_s": return "%H:%i:%S"; + case "y_M_d_H": + return "%Y" + split + "%m" + split + "%d" + " %H"; case "y_M_d_H_m": return "%Y" + split + "%m" + split + "%d" + " %H:%i"; case "y_M_d_H_m_s": diff --git a/core/backend/src/main/java/io/dataease/provider/query/ck/CKQueryProvider.java b/core/backend/src/main/java/io/dataease/provider/query/ck/CKQueryProvider.java index 18b8ed35d8..9d6f7cf6a5 100644 --- a/core/backend/src/main/java/io/dataease/provider/query/ck/CKQueryProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/query/ck/CKQueryProvider.java @@ -820,9 +820,9 @@ public class CKQueryProvider extends QueryProvider { } public String getTotalCount(boolean isTable, String sql, Datasource ds) { - if(isTable){ + if (isTable) { return "SELECT COUNT(*) from " + String.format(CKConstants.KEYWORD_TABLE, sql); - }else { + } else { return "SELECT COUNT(*) from ( " + sqlFix(sql) + " ) DE_COUNT_TEMP"; } } @@ -1251,6 +1251,8 @@ public class CKQueryProvider extends QueryProvider { return "%Y" + split + "%m" + split + "%d"; case "H_m_s": return "%H:%M:%S"; + case "y_M_d_H": + return "%Y" + split + "%m" + split + "%d" + " %H"; case "y_M_d_H_m": return "%Y" + split + "%m" + split + "%d" + " %H:%M"; case "y_M_d_H_m_s": diff --git a/core/backend/src/main/java/io/dataease/provider/query/db2/Db2QueryProvider.java b/core/backend/src/main/java/io/dataease/provider/query/db2/Db2QueryProvider.java index 4899c0da2a..394c6d0aa4 100644 --- a/core/backend/src/main/java/io/dataease/provider/query/db2/Db2QueryProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/query/db2/Db2QueryProvider.java @@ -1122,25 +1122,25 @@ public class Db2QueryProvider extends QueryProvider { } else { originName = String.format(Db2Constants.STR_TO_DATE, originName); } - if(request.getOperator().equals("between")){ + if (request.getOperator().equals("between")) { whereName = originName; - }else { + } else { whereName = String.format(Db2Constants.DATE_FORMAT, originName, format); } } if (field.getDeExtractType() == DeTypeConstants.DE_INT || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { - if(request.getOperator().equals("between")){ + if (request.getOperator().equals("between")) { String cast = String.format(Db2Constants.CAST, originName, Db2Constants.DEFAULT_INT_FORMAT); whereName = String.format(Db2Constants.FROM_UNIXTIME, cast, Db2Constants.DEFAULT_DATE_FORMAT); - }else { + } else { String cast = String.format(Db2Constants.CAST, originName, Db2Constants.DEFAULT_INT_FORMAT); whereName = String.format(Db2Constants.FROM_UNIXTIME, cast, format); } } if (field.getDeExtractType() == DeTypeConstants.DE_TIME) { - if(request.getOperator().equals("between")){ + if (request.getOperator().equals("between")) { whereName = originName; - }else { + } else { if (field.getType().equalsIgnoreCase("TIME")) { whereName = String.format(Db2Constants.FORMAT_TIME, originName, format); } else if (field.getType().equalsIgnoreCase("DATE")) { @@ -1242,6 +1242,8 @@ public class Db2QueryProvider extends QueryProvider { return "YYYY" + split + "MM" + split + "DD"; case "H_m_s": return "HH24:MI:SS"; + case "y_M_d_H": + return "YYYY" + split + "MM" + split + "DD" + " HH24"; case "y_M_d_H_m": return "YYYY" + split + "MM" + split + "DD" + " HH24:MI"; case "y_M_d_H_m_s": diff --git a/core/backend/src/main/java/io/dataease/provider/query/es/EsQueryProvider.java b/core/backend/src/main/java/io/dataease/provider/query/es/EsQueryProvider.java index 7f3f5f9f38..610e837715 100644 --- a/core/backend/src/main/java/io/dataease/provider/query/es/EsQueryProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/query/es/EsQueryProvider.java @@ -1174,6 +1174,8 @@ public class EsQueryProvider extends QueryProvider { return "yyyy" + split + "MM" + split + "dd"; case "H_m_s": return "HH:mm:ss"; + case "y_M_d_H": + return "yyyy" + split + "MM" + split + "dd" + " HH"; case "y_M_d_H_m": return "yyyy" + split + "MM" + split + "dd" + " HH:mm"; case "y_M_d_H_m_s": @@ -1329,7 +1331,7 @@ public class EsQueryProvider extends QueryProvider { } public String getResultCount(boolean isTable, String sql, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { - return null; + return null; } @Override diff --git a/core/backend/src/main/java/io/dataease/provider/query/hive/HiveQueryProvider.java b/core/backend/src/main/java/io/dataease/provider/query/hive/HiveQueryProvider.java index 463530d966..697c370f70 100644 --- a/core/backend/src/main/java/io/dataease/provider/query/hive/HiveQueryProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/query/hive/HiveQueryProvider.java @@ -1147,6 +1147,8 @@ public class HiveQueryProvider extends QueryProvider { return "yyyy" + split + "MM" + split + "dd"; case "H_m_s": return "HH:mm:ss"; + case "y_M_d_H": + return "yyyy" + split + "MM" + split + "dd" + " HH"; case "y_M_d_H_m": return "yyyy" + split + "MM" + split + "dd" + " HH:mm"; case "y_M_d_H_m_s": diff --git a/core/backend/src/main/java/io/dataease/provider/query/impala/ImpalaQueryProvider.java b/core/backend/src/main/java/io/dataease/provider/query/impala/ImpalaQueryProvider.java index a62a7fbf2e..9f3989a44a 100644 --- a/core/backend/src/main/java/io/dataease/provider/query/impala/ImpalaQueryProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/query/impala/ImpalaQueryProvider.java @@ -1153,6 +1153,8 @@ public class ImpalaQueryProvider extends QueryProvider { return "yyyy" + split + "MM" + split + "dd"; case "H_m_s": return "HH:mm:ss"; + case "y_M_d_H": + return "yyyy" + split + "MM" + split + "dd" + " HH"; case "y_M_d_H_m": return "yyyy" + split + "MM" + split + "dd" + " HH:mm"; case "y_M_d_H_m_s": diff --git a/core/backend/src/main/java/io/dataease/provider/query/mongodb/MongoQueryProvider.java b/core/backend/src/main/java/io/dataease/provider/query/mongodb/MongoQueryProvider.java index 73218b28d8..7e4ebcc7e1 100644 --- a/core/backend/src/main/java/io/dataease/provider/query/mongodb/MongoQueryProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/query/mongodb/MongoQueryProvider.java @@ -1038,6 +1038,8 @@ public class MongoQueryProvider extends QueryProvider { return "%Y" + split + "%m" + split + "%d"; case "H_m_s": return "%H:%i:%S"; + case "y_M_d_H": + return "%Y" + split + "%m" + split + "%d" + " %H"; case "y_M_d_H_m": return "%Y" + split + "%m" + split + "%d" + " %H:%i"; case "y_M_d_H_m_s": diff --git a/core/backend/src/main/java/io/dataease/provider/query/mysql/MysqlQueryProvider.java b/core/backend/src/main/java/io/dataease/provider/query/mysql/MysqlQueryProvider.java index 8b61050428..17f7a77641 100644 --- a/core/backend/src/main/java/io/dataease/provider/query/mysql/MysqlQueryProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/query/mysql/MysqlQueryProvider.java @@ -1190,6 +1190,8 @@ public class MysqlQueryProvider extends QueryProvider { return "%Y" + split + "%m" + split + "%d"; case "H_m_s": return "%H:%i:%S"; + case "y_M_d_H": + return "%Y" + split + "%m" + split + "%d" + " %H"; case "y_M_d_H_m": return "%Y" + split + "%m" + split + "%d" + " %H:%i"; case "y_M_d_H_m_s": diff --git a/core/backend/src/main/java/io/dataease/provider/query/oracle/OracleQueryProvider.java b/core/backend/src/main/java/io/dataease/provider/query/oracle/OracleQueryProvider.java index 7eef266f6e..5dd5ab8763 100644 --- a/core/backend/src/main/java/io/dataease/provider/query/oracle/OracleQueryProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/query/oracle/OracleQueryProvider.java @@ -1317,6 +1317,8 @@ public class OracleQueryProvider extends QueryProvider { return "YYYY" + split + "MM" + split + "DD"; case "H_m_s": return "HH24:MI:SS"; + case "y_M_d_H": + return "YYYY" + split + "MM" + split + "DD" + " HH24"; case "y_M_d_H_m": return "YYYY" + split + "MM" + split + "DD" + " HH24:MI"; case "y_M_d_H_m_s": diff --git a/core/backend/src/main/java/io/dataease/provider/query/pg/PgQueryProvider.java b/core/backend/src/main/java/io/dataease/provider/query/pg/PgQueryProvider.java index a7f9e17295..bb00acfdee 100644 --- a/core/backend/src/main/java/io/dataease/provider/query/pg/PgQueryProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/query/pg/PgQueryProvider.java @@ -1181,6 +1181,8 @@ public class PgQueryProvider extends QueryProvider { return "YYYY" + split + "MM" + split + "DD"; case "H_m_s": return "HH24:MI:SS"; + case "y_M_d_H": + return "YYYY" + split + "MM" + split + "DD" + " HH24"; case "y_M_d_H_m": return "YYYY" + split + "MM" + split + "DD" + " HH24:MI"; case "y_M_d_H_m_s": diff --git a/core/backend/src/main/java/io/dataease/provider/query/redshift/RedshiftQueryProvider.java b/core/backend/src/main/java/io/dataease/provider/query/redshift/RedshiftQueryProvider.java index 56543a16a3..393c4d040a 100644 --- a/core/backend/src/main/java/io/dataease/provider/query/redshift/RedshiftQueryProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/query/redshift/RedshiftQueryProvider.java @@ -1169,6 +1169,8 @@ public class RedshiftQueryProvider extends QueryProvider { return "YYYY" + split + "MM" + split + "DD"; case "H_m_s": return "HH24:MI:SS'"; + case "y_M_d_H": + return "YYYY" + split + "MM" + split + "DD" + " HH24"; case "y_M_d_H_m": return "YYYY" + split + "MM" + split + "DD" + " HH24:MI"; case "y_M_d_H_m_s": diff --git a/core/backend/src/main/java/io/dataease/provider/query/sqlserver/SqlserverQueryProvider.java b/core/backend/src/main/java/io/dataease/provider/query/sqlserver/SqlserverQueryProvider.java index b9d8acf5c5..53821d0b14 100644 --- a/core/backend/src/main/java/io/dataease/provider/query/sqlserver/SqlserverQueryProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/query/sqlserver/SqlserverQueryProvider.java @@ -1227,6 +1227,12 @@ public class SqlserverQueryProvider extends QueryProvider { } case "H_m_s": return "CONVERT(varchar(100), " + originField + ", 8)"; + case "y_M_d_H": + if (split.equalsIgnoreCase("-")) { + return "substring( convert(varchar," + originField + ",120),1,13)"; + } else { + return "replace(" + "substring( convert(varchar," + originField + ",120),1,13), '-','/')"; + } case "y_M_d_H_m": if (split.equalsIgnoreCase("-")) { return "substring( convert(varchar," + originField + ",120),1,16)"; diff --git a/core/backend/src/main/java/io/dataease/service/sys/SysUserService.java b/core/backend/src/main/java/io/dataease/service/sys/SysUserService.java index bd97baded8..39dcdc5167 100644 --- a/core/backend/src/main/java/io/dataease/service/sys/SysUserService.java +++ b/core/backend/src/main/java/io/dataease/service/sys/SysUserService.java @@ -3,16 +3,16 @@ package io.dataease.service.sys; import io.dataease.auth.api.dto.CurrentUserDto; import io.dataease.auth.service.AuthUserService; import io.dataease.auth.service.ExtAuthService; -import io.dataease.commons.exception.DEException; -import io.dataease.controller.sys.request.*; -import io.dataease.ext.ExtSysUserMapper; -import io.dataease.ext.query.GridExample; import io.dataease.commons.constants.AuthConstants; +import io.dataease.commons.exception.DEException; import io.dataease.commons.utils.AuthUtils; import io.dataease.commons.utils.BeanUtils; import io.dataease.commons.utils.CodingUtil; +import io.dataease.controller.sys.request.*; import io.dataease.controller.sys.response.SysUserGridResponse; import io.dataease.controller.sys.response.SysUserRole; +import io.dataease.ext.ExtSysUserMapper; +import io.dataease.ext.query.GridExample; import io.dataease.i18n.Translator; import io.dataease.plugins.common.base.domain.*; import io.dataease.plugins.common.base.mapper.SysUserAssistMapper; @@ -23,7 +23,6 @@ import io.dataease.plugins.xpack.dingtalk.dto.response.DingUserEntity; import io.dataease.plugins.xpack.lark.dto.entity.LarkUserInfo; import io.dataease.plugins.xpack.larksuite.dto.entity.UserData; import io.dataease.plugins.xpack.oidc.dto.SSOUserInfo; - import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; @@ -33,7 +32,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; - import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -605,4 +603,7 @@ public class SysUserService { sysUserMapper.updateByPrimaryKeySelective(sysUser); } + public String adminEmail() { + return extSysUserMapper.queryAdminEmail(); + } } diff --git a/core/backend/src/main/java/io/dataease/service/system/EmailService.java b/core/backend/src/main/java/io/dataease/service/system/EmailService.java index e1578c352a..a888ea27b8 100644 --- a/core/backend/src/main/java/io/dataease/service/system/EmailService.java +++ b/core/backend/src/main/java/io/dataease/service/system/EmailService.java @@ -277,6 +277,60 @@ public class EmailService { }); } + private JavaMailSenderImpl buildSender() { + MailInfo mailInfo = proxy().mailInfo(); + checkMailInfo(mailInfo); + JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl(); + javaMailSender.setDefaultEncoding("UTF-8"); + javaMailSender.setHost(mailInfo.getHost()); + javaMailSender.setPort(Integer.parseInt(mailInfo.getPort())); + javaMailSender.setUsername(mailInfo.getAccount()); + javaMailSender.setPassword(mailInfo.getPassword()); + Properties props = new Properties(); + if (BooleanUtils.toBoolean(mailInfo.getSsl())) { + props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); + } + if (BooleanUtils.toBoolean(mailInfo.getTls())) { + props.put("mail.smtp.starttls.enable", "true"); + } + props.put("mail.smtp.timeout", "30000"); + props.put("mail.smtp.connectiontimeout", "10000"); + javaMailSender.setJavaMailProperties(props); + return javaMailSender; + } + + private void testSendEmail(String recipients, JavaMailSenderImpl javaMailSender, boolean isAdmin) { + if (!StringUtils.isBlank(recipients)) { + MimeMessage mimeMessage = javaMailSender.createMimeMessage(); + MimeMessageHelper helper; + try { + helper = new MimeMessageHelper(mimeMessage, true); + helper.setFrom(javaMailSender.getUsername()); + helper.setSubject("DataEase测试邮件 "); + helper.setText("这是一封测试邮件,邮件发送成功", true); + helper.setTo(recipients); + javaMailSender.send(mimeMessage); + } catch (Exception e) { + LogUtil.error(e.getMessage(), e); + String key = "connection_failed"; + if (isAdmin) key = "connection_failed_admin"; + DEException.throwException(Translator.get(key)); + } + } + } + + public void testConnection(String email) { + JavaMailSenderImpl javaMailSender = null; + try { + javaMailSender = buildSender(); + javaMailSender.testConnection(); + } catch (MessagingException e) { + LogUtil.error(e.getMessage(), e); + DEException.throwException(Translator.get("connection_failed")); + } + testSendEmail(email, javaMailSender, true); + } + public void testConnection(HashMap hashMap) { JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl(); javaMailSender.setDefaultEncoding("UTF-8"); @@ -301,21 +355,6 @@ public class EmailService { LogUtil.error(e.getMessage(), e); DEException.throwException(Translator.get("connection_failed")); } - if (!StringUtils.isBlank(recipients)) { - MimeMessage mimeMessage = javaMailSender.createMimeMessage(); - MimeMessageHelper helper; - try { - helper = new MimeMessageHelper(mimeMessage, true); - helper.setFrom(javaMailSender.getUsername()); - helper.setSubject("DataEase测试邮件 "); - helper.setText("这是一封测试邮件,邮件发送成功", true); - helper.setTo(recipients); - javaMailSender.send(mimeMessage); - } catch (Exception e) { - LogUtil.error(e.getMessage(), e); - DEException.throwException(Translator.get("connection_failed")); - } - } - + testSendEmail(recipients, javaMailSender, false); } } diff --git a/core/backend/src/main/java/io/dataease/service/system/SystemParameterService.java b/core/backend/src/main/java/io/dataease/service/system/SystemParameterService.java index 29ee567046..b0f5402b69 100644 --- a/core/backend/src/main/java/io/dataease/service/system/SystemParameterService.java +++ b/core/backend/src/main/java/io/dataease/service/system/SystemParameterService.java @@ -7,6 +7,7 @@ import io.dataease.commons.utils.EncryptUtils; import io.dataease.controller.sys.response.BasicInfo; import io.dataease.dto.SystemParameterDTO; import io.dataease.exception.DataEaseException; +import io.dataease.ext.ExtSystemParameterMapper; import io.dataease.plugins.common.base.domain.FileMetadata; import io.dataease.plugins.common.base.domain.SystemParameter; import io.dataease.plugins.common.base.domain.SystemParameterExample; @@ -26,6 +27,7 @@ import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; +import springfox.documentation.annotations.Cacheable; import javax.annotation.Resource; import javax.imageio.ImageIO; @@ -34,9 +36,6 @@ import java.io.InputStream; import java.util.*; import java.util.concurrent.atomic.AtomicReference; -import io.dataease.ext.*; -import springfox.documentation.annotations.Cacheable; - @Service @Transactional(rollbackFor = Exception.class) public class SystemParameterService { @@ -129,6 +128,10 @@ public class SystemParameterService { boolean open = StringUtils.equals("true", param.getParamValue()); result.setOpen(open ? "true" : "false"); } + if (StringUtils.equals(param.getParamKey(), ParamConstants.BASIC.LOCKED_EMAIL.getValue())) { + boolean open = StringUtils.equals("true", param.getParamValue()); + result.setLockedEmail(open ? "true" : "false"); + } if (StringUtils.equals(param.getParamKey(), ParamConstants.BASIC.SCAN_CREATE_USER.getValue())) { boolean open = StringUtils.equals("true", param.getParamValue()); result.setScanCreateUser(open ? "true" : "false"); @@ -166,8 +169,7 @@ public class SystemParameterService { CasSaveResult casSaveResult = afterSwitchDefaultLogin(parameters); BasicInfo basicInfo = basicInfo(); String oldMultiLogin = this.getValue("loginlimit.multiLogin"); - for (int i = 0; i < parameters.size(); i++) { - SystemParameter parameter = parameters.get(i); + for (SystemParameter parameter : parameters) { SystemParameterExample example = new SystemParameterExample(); example.createCriteria().andParamKeyEqualTo(parameter.getParamKey()); @@ -280,6 +282,16 @@ public class SystemParameterService { return param.getParamValue(); } + public void disabledLockedEmail() { + SystemParameter param = systemParameterMapper.selectByPrimaryKey(ParamConstants.BASIC.LOCKED_EMAIL.getValue()); + if (ObjectUtils.isNotEmpty(param)) { + SystemParameterExample example = new SystemParameterExample(); + example.createCriteria().andParamKeyEqualTo(ParamConstants.BASIC.LOCKED_EMAIL.getValue()); + param.setParamValue("false"); + systemParameterMapper.updateByExample(param, example); + } + } + public Integer defaultLoginType() { String value = getValue(LOGIN_TYPE_KEY); return StringUtils.isNotBlank(value) ? Integer.parseInt(value) : 0; diff --git a/core/backend/src/main/resources/db/migration/V18__add_demo.sql b/core/backend/src/main/resources/db/migration/V18__add_demo.sql index 6419a2cfba..b7f13fd14b 100644 --- a/core/backend/src/main/resources/db/migration/V18__add_demo.sql +++ b/core/backend/src/main/resources/db/migration/V18__add_demo.sql @@ -228,7 +228,7 @@ SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for demo_new_trend_of_diagnosis -- ---------------------------- -CREATE TABLE `demo_new_trend_of_diagnosis` ( +CREATE TABLE IF NOT EXISTS `demo_new_trend_of_diagnosis` ( `date` varchar(50) NOT NULL DEFAULT '' COMMENT '日期', `new_diagnosis` bigint(13) DEFAULT NULL COMMENT '新增确诊', `current_diagnosis` bigint(13) DEFAULT NULL COMMENT '现有确诊' diff --git a/core/backend/src/main/resources/i18n/messages_en_US.properties b/core/backend/src/main/resources/i18n/messages_en_US.properties index 5583a54bf4..090389c5c3 100644 --- a/core/backend/src/main/resources/i18n/messages_en_US.properties +++ b/core/backend/src/main/resources/i18n/messages_en_US.properties @@ -129,6 +129,7 @@ i18n_field_name_repeat=Field name can't repeat i18n_calc_field_error=Field expression error i18n_cp_exist=Column permission of the same type already exists connection_failed=Connection Failed +connection_failed_admin=Connection failed, please check email configuration or administrator mailbox theme_name_repeat=name of theme has been existed theme_name_empty=name can not be empty i18n_public_chart=\u3010Public Chart\u3011 diff --git a/core/backend/src/main/resources/i18n/messages_zh_CN.properties b/core/backend/src/main/resources/i18n/messages_zh_CN.properties index 7a2810cf0f..05b70ad31a 100644 --- a/core/backend/src/main/resources/i18n/messages_zh_CN.properties +++ b/core/backend/src/main/resources/i18n/messages_zh_CN.properties @@ -129,6 +129,7 @@ i18n_field_name_repeat=\u5B57\u6BB5\u540D\u4E0D\u80FD\u91CD\u590D i18n_calc_field_error=\u5B57\u6BB5\u8868\u8FBE\u5F0F\u8BED\u6CD5\u9519\u8BEF i18n_cp_exist=\u5DF2\u6709\u540C\u7C7B\u578B\u7684\u5217\u6743\u9650\u5B58\u5728 connection_failed=\u8FDE\u63A5\u5931\u8D25 +connection_failed_admin=\u8FDE\u63A5\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u90AE\u4EF6\u914D\u7F6E\u6216\u7BA1\u7406\u5458\u90AE\u7BB1 theme_name_repeat=\u540D\u79F0\u5DF2\u5B58\u5728 theme_name_empty=\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A i18n_public_chart=\u3010\u5B58\u91CF\u89C6\u56FE\u3011 diff --git a/core/backend/src/main/resources/i18n/messages_zh_TW.properties b/core/backend/src/main/resources/i18n/messages_zh_TW.properties index acc0018ed3..f4c4df9008 100644 --- a/core/backend/src/main/resources/i18n/messages_zh_TW.properties +++ b/core/backend/src/main/resources/i18n/messages_zh_TW.properties @@ -129,6 +129,7 @@ i18n_field_name_repeat=\u5B57\u6BB5\u540D\u4E0D\u80FD\u91CD\u5FA9 i18n_calc_field_error=\u5B57\u6BB5\u8868\u9054\u5F0F\u8A9E\u6CD5\u932F\u8AA4 i18n_cp_exist=\u5DF2\u6709\u540C\u985E\u578B\u7684\u5217\u6B0A\u9650\u5B58\u5728 connection_failed=\u9023\u63A5\u5931\u6557 +connection_failed_admin=\u9023\u63A5\u5931\u6557\uFF0C\u8ACB\u6AA2\u67E5\u90F5\u4EF6\u914D\u7F6E\u6216\u7BA1\u7406\u54E1\u90F5\u7BB1 theme_name_repeat=\u540D\u7A31\u5DF2\u5B58\u5728 theme_name_empty=\u540D\u7A31\u4E0D\u80FD\u70BA\u7A7A i18n_public_chart=\u3010\u5B58\u91CF\u89C6\u56FE\u3011 diff --git a/core/frontend/src/components/canvas/components/editor/LinkageField.vue b/core/frontend/src/components/canvas/components/editor/LinkageField.vue index 50f3ff391f..fde3888639 100644 --- a/core/frontend/src/components/canvas/components/editor/LinkageField.vue +++ b/core/frontend/src/components/canvas/components/editor/LinkageField.vue @@ -120,7 +120,8 @@ icon="el-icon-plus" round @click="addLinkageField(null,null)" - >追加联动依赖字段 + >追加联动依赖字段 + @@ -132,8 +133,9 @@ diff --git a/core/frontend/src/lang/en.js b/core/frontend/src/lang/en.js index e81b23265a..10e6b67d83 100644 --- a/core/frontend/src/lang/en.js +++ b/core/frontend/src/lang/en.js @@ -1192,6 +1192,7 @@ export default { y_W: 'Year Week', y_M_d: 'Year Month Day', H_m_s: 'Hour Minute Second', + y_M_d_H: 'Year Month Day Hour', y_M_d_H_m: 'Year Month Day Hour Minute', y_M_d_H_m_s: 'Year Month Day Hour Minute Second', date_sub: 'yyyy-MM-dd', diff --git a/core/frontend/src/lang/tw.js b/core/frontend/src/lang/tw.js index 574745c5eb..f5a2062a6b 100644 --- a/core/frontend/src/lang/tw.js +++ b/core/frontend/src/lang/tw.js @@ -1191,6 +1191,7 @@ export default { y_W: '年周', y_M_d: '年月日', H_m_s: '時分秒', + y_M_d_H: '年月日時', y_M_d_H_m: '年月日時分', y_M_d_H_m_s: '年月日時分秒', date_sub: 'yyyy-MM-dd', diff --git a/core/frontend/src/lang/zh.js b/core/frontend/src/lang/zh.js index afca486999..983477b26e 100644 --- a/core/frontend/src/lang/zh.js +++ b/core/frontend/src/lang/zh.js @@ -1190,6 +1190,7 @@ export default { y_W: '年周', y_M_d: '年月日', H_m_s: '时分秒', + y_M_d_H: '年月日时', y_M_d_H_m: '年月日时分', y_M_d_H_m_s: '年月日时分秒', date_sub: 'yyyy-MM-dd', diff --git a/core/frontend/src/views/chart/components/dragItem/DimensionExtItem.vue b/core/frontend/src/views/chart/components/dragItem/DimensionExtItem.vue index fca25c18d9..322deb7308 100644 --- a/core/frontend/src/views/chart/components/dragItem/DimensionExtItem.vue +++ b/core/frontend/src/views/chart/components/dragItem/DimensionExtItem.vue @@ -122,6 +122,7 @@ :command="beforeDateStyle('H_m_s')" divided >{{ $t('chart.H_m_s') }} + {{ $t('chart.y_M_d_H') }} {{ $t('chart.y_M_d_H_m') }} {{ $t('chart.y_M_d_H_m_s') }} diff --git a/core/frontend/src/views/chart/components/dragItem/DimensionItem.vue b/core/frontend/src/views/chart/components/dragItem/DimensionItem.vue index 1b5aade2ad..b0fbd2aebd 100644 --- a/core/frontend/src/views/chart/components/dragItem/DimensionItem.vue +++ b/core/frontend/src/views/chart/components/dragItem/DimensionItem.vue @@ -130,6 +130,7 @@ :command="beforeDateStyle('H_m_s')" divided >{{ $t('chart.H_m_s') }} + {{ $t('chart.y_M_d_H') }} {{ $t('chart.y_M_d_H_m') }} {{ $t('chart.y_M_d_H_m_s') }} diff --git a/core/frontend/src/views/system/sysParam/BasicSetting.vue b/core/frontend/src/views/system/sysParam/BasicSetting.vue index e7db140ee8..7d34229fcd 100644 --- a/core/frontend/src/views/system/sysParam/BasicSetting.vue +++ b/core/frontend/src/views/system/sysParam/BasicSetting.vue @@ -366,6 +366,7 @@ export default { this.originLoginType = this.formInline.loginType } this.formInline.open = (this.formInline.open && this.formInline.open === 'true') + this.formInline.lockedEmail = this.formInline?.lockedEmail === 'true' this.formInline.scanCreateUser = (this.formInline.scanCreateUser && this.formInline.scanCreateUser === 'true') this.$nextTick(() => { @@ -455,6 +456,12 @@ export default { type: 'text', sort: 3 }, + { + paramKey: 'loginlimit.lockedEmail', + paramValue: this.formInline.lockedEmail, + type: 'text', + sort: 4 + }, { paramKey: 'loginlimit.scanCreateUser', paramValue: this.formInline.scanCreateUser, diff --git a/sdk/dataease-plugin-interface/src/main/java/io/dataease/plugins/xpack/loginlimit/dto/response/LoginLimitInfo.java b/sdk/dataease-plugin-interface/src/main/java/io/dataease/plugins/xpack/loginlimit/dto/response/LoginLimitInfo.java index f076213d9f..59344be9bb 100644 --- a/sdk/dataease-plugin-interface/src/main/java/io/dataease/plugins/xpack/loginlimit/dto/response/LoginLimitInfo.java +++ b/sdk/dataease-plugin-interface/src/main/java/io/dataease/plugins/xpack/loginlimit/dto/response/LoginLimitInfo.java @@ -14,4 +14,6 @@ public class LoginLimitInfo { private String scanCreateUser; private String multiLogin; + + private String lockedEmail = "false"; }