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