forked from github/dataease
Merge branch 'dev' into pr@dev_refresh
This commit is contained in:
commit
cf1de9d11a
@ -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();
|
||||
|
@ -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"),
|
||||
|
||||
|
@ -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("静态文件")
|
||||
|
@ -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")
|
||||
|
@ -9,10 +9,10 @@
|
||||
</resultMap>
|
||||
|
||||
<sql id="Base_Column_List">
|
||||
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
|
||||
</sql>
|
||||
<sql id="Blob_Column_List">
|
||||
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
|
||||
</sql>
|
||||
|
||||
<select id="panelTemplate" resultMap="BaseResultMapDTO">
|
||||
|
@ -9,4 +9,6 @@ public interface ExtSysUserMapper {
|
||||
List<SysUserGridResponse> query(GridExample example);
|
||||
|
||||
List<String> ldapUserNames(Integer from);
|
||||
|
||||
String queryAdminEmail();
|
||||
}
|
||||
|
@ -2,25 +2,27 @@
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
|
||||
<mapper namespace="io.dataease.ext.ExtSysUserMapper">
|
||||
|
||||
<resultMap id="sysUserDept" type="io.dataease.controller.sys.response.SysUserDept" >
|
||||
<resultMap id="sysUserDept" type="io.dataease.controller.sys.response.SysUserDept">
|
||||
<id column="dept_id" property="deptId"></id>
|
||||
<result column="pid" property="pid"></result>
|
||||
<result column="dept_name" property="deptName"></result>
|
||||
</resultMap>
|
||||
|
||||
<resultMap id="sysUserRole" type="io.dataease.controller.sys.response.SysUserRole" >
|
||||
<resultMap id="sysUserRole" type="io.dataease.controller.sys.response.SysUserRole">
|
||||
<result column="role_id" property="roleId"></result>
|
||||
<result column="role_name" property="roleName"></result>
|
||||
</resultMap>
|
||||
|
||||
<resultMap id="BaseResultMap" type="io.dataease.controller.sys.response.SysUserGridResponse" extends="io.dataease.plugins.common.base.mapper.SysUserMapper.BaseResultMap">
|
||||
<resultMap id="BaseResultMap" type="io.dataease.controller.sys.response.SysUserGridResponse"
|
||||
extends="io.dataease.plugins.common.base.mapper.SysUserMapper.BaseResultMap">
|
||||
<result property="id" column="id"></result>
|
||||
<association property="dept" javaType="io.dataease.controller.sys.response.SysUserDept">
|
||||
<id column="dept_id" property="deptId"/>
|
||||
<result column="pid" property="pid" />
|
||||
<result column="dept_name" property="deptName" />
|
||||
<result column="pid" property="pid"/>
|
||||
<result column="dept_name" property="deptName"/>
|
||||
</association>
|
||||
<association property="dept" column="dept_id" javaType="io.dataease.controller.sys.response.SysUserDept" resultMap="sysUserDept"/>
|
||||
<association property="dept" column="dept_id" javaType="io.dataease.controller.sys.response.SysUserDept"
|
||||
resultMap="sysUserDept"/>
|
||||
|
||||
<collection property="roles"
|
||||
javaType="java.util.ArrayList"
|
||||
@ -31,8 +33,6 @@
|
||||
</resultMap>
|
||||
|
||||
|
||||
|
||||
|
||||
<select id="query" parameterType="io.dataease.ext.query.GridExample" resultMap="BaseResultMap">
|
||||
SELECT DISTINCT
|
||||
u.*,
|
||||
@ -41,20 +41,20 @@
|
||||
d.NAME AS dept_name
|
||||
FROM
|
||||
(
|
||||
select * from sys_user
|
||||
<if test="extendCondition != null">
|
||||
where
|
||||
nick_name like concat('%', #{extendCondition} , '%')
|
||||
or
|
||||
email like concat('%', #{extendCondition} , '%')
|
||||
</if>
|
||||
select * from sys_user
|
||||
<if test="extendCondition != null">
|
||||
where
|
||||
nick_name like concat('%', #{extendCondition} , '%')
|
||||
or
|
||||
email like concat('%', #{extendCondition} , '%')
|
||||
</if>
|
||||
) 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
|
||||
|
||||
<if test="_parameter != null">
|
||||
<include refid="io.dataease.ext.query.GridSql.gridCondition" />
|
||||
<include refid="io.dataease.ext.query.GridSql.gridCondition"/>
|
||||
</if>
|
||||
<if test="orderByClause != null">
|
||||
order by ${orderByClause}
|
||||
@ -67,11 +67,19 @@
|
||||
<select id="queryRole" resultMap="sysUserRole">
|
||||
select r.role_id, r.name as role_name
|
||||
from sys_users_roles sur
|
||||
left join sys_role r on r.role_id = sur.role_id
|
||||
left join sys_role r on r.role_id = sur.role_id
|
||||
where sur.user_id = #{user_id}
|
||||
</select>
|
||||
|
||||
<select id="ldapUserNames" resultType="java.lang.String" parameterType="java.lang.Integer">
|
||||
select username from sys_user u where u.from = #{from}
|
||||
select username
|
||||
from sys_user u
|
||||
where u.from = #{from}
|
||||
</select>
|
||||
|
||||
<select id="queryAdminEmail" resultType="String">
|
||||
select email
|
||||
from sys_user
|
||||
where user_id = 1
|
||||
</select>
|
||||
</mapper>
|
||||
|
@ -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":
|
||||
|
@ -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":
|
||||
|
@ -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":
|
||||
|
@ -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":
|
||||
|
@ -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<ChartViewFieldDTO> xAxis, List<ChartFieldCustomFilterDTO> fieldCustomFilter, List<DataSetRowPermissionsTreeDTO> rowPermissionsTree, List<ChartExtFilterRequest> extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) {
|
||||
return null;
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -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":
|
||||
|
@ -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":
|
||||
|
@ -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":
|
||||
|
@ -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":
|
||||
|
@ -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":
|
||||
|
@ -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":
|
||||
|
@ -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":
|
||||
|
@ -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)";
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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<String, String> 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);
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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 '现有确诊'
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -120,7 +120,8 @@
|
||||
icon="el-icon-plus"
|
||||
round
|
||||
@click="addLinkageField(null,null)"
|
||||
>追加联动依赖字段</el-button>
|
||||
>追加联动依赖字段
|
||||
</el-button>
|
||||
</el-row>
|
||||
|
||||
<!-- <el-button slot="reference">T</el-button>-->
|
||||
@ -132,8 +133,9 @@
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { mapState } from 'vuex'
|
||||
import { checkSameDataSet } from '@/api/chart/chart'
|
||||
import {mapState} from 'vuex'
|
||||
import {checkSameDataSet} from '@/api/chart/chart'
|
||||
|
||||
export default {
|
||||
|
||||
props: {
|
||||
@ -172,18 +174,24 @@ export default {
|
||||
},
|
||||
...mapState([
|
||||
'targetLinkageInfo',
|
||||
'curLinkageView'
|
||||
'curLinkageView',
|
||||
'panelViewDetailsInfo'
|
||||
])
|
||||
},
|
||||
mounted() {
|
||||
const _this = this
|
||||
// 初始化映射关系 如果当前是相同的数据集且没有关联关系,则自动补充映射关系
|
||||
checkSameDataSet(this.curLinkageView.propValue.viewId, this.element.propValue.viewId).then(res => {
|
||||
const chartDetails = JSON.parse(this.panelViewDetailsInfo[this.curLinkageView.propValue.viewId])
|
||||
const curCheckAllAxisStr = chartDetails.xaxis + chartDetails.xaxisExt + chartDetails.yaxis + chartDetails.yaxisExt
|
||||
const targetChartDetails = JSON.parse(this.panelViewDetailsInfo[this.element.propValue.viewId])
|
||||
const targetCheckAllAxisStr = targetChartDetails.xaxis + targetChartDetails.xaxisExt + targetChartDetails.yaxis + targetChartDetails.yaxisExt
|
||||
|
||||
if (res.data === 'YES' && this.linkageInfo.linkageFields.length === 0) {
|
||||
this.sourceLinkageInfo.targetViewFields.forEach(item => {
|
||||
_this.$nextTick(() => {
|
||||
if (curCheckAllAxisStr.includes(item.id)&&targetCheckAllAxisStr.includes(item.id)) {
|
||||
this.addLinkageField(item.id, item.id)
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
@ -213,46 +221,48 @@ export default {
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.slot-class{
|
||||
color: white;
|
||||
}
|
||||
.slot-class {
|
||||
color: white;
|
||||
}
|
||||
|
||||
.bottom {
|
||||
margin-top: 20px;
|
||||
text-align: center;
|
||||
.bottom {
|
||||
margin-top: 20px;
|
||||
text-align: center;
|
||||
|
||||
}
|
||||
.ellip{
|
||||
/*width: 100%;*/
|
||||
margin-left: 10px;
|
||||
margin-right: 10px;
|
||||
overflow: hidden;/*超出部分隐藏*/
|
||||
white-space: nowrap;/*不换行*/
|
||||
text-overflow:ellipsis;/*超出部分文字以...显示*/
|
||||
background-color: #f7f8fa;
|
||||
color: #3d4d66;
|
||||
font-size: 12px;
|
||||
line-height: 24px;
|
||||
height: 24px;
|
||||
border-radius: 3px;
|
||||
}
|
||||
}
|
||||
|
||||
.select-filed{
|
||||
/*width: 100%;*/
|
||||
margin-left: 10px;
|
||||
margin-right: 10px;
|
||||
overflow: hidden;/*超出部分隐藏*/
|
||||
white-space: nowrap;/*不换行*/
|
||||
text-overflow:ellipsis;/*超出部分文字以...显示*/
|
||||
color: #3d4d66;
|
||||
font-size: 12px;
|
||||
line-height: 35px;
|
||||
height: 35px;
|
||||
border-radius: 3px;
|
||||
}
|
||||
::v-deep .el-popover{
|
||||
height: 200px;
|
||||
overflow: auto;
|
||||
}
|
||||
.ellip {
|
||||
/*width: 100%;*/
|
||||
margin-left: 10px;
|
||||
margin-right: 10px;
|
||||
overflow: hidden; /*超出部分隐藏*/
|
||||
white-space: nowrap; /*不换行*/
|
||||
text-overflow: ellipsis; /*超出部分文字以...显示*/
|
||||
background-color: #f7f8fa;
|
||||
color: #3d4d66;
|
||||
font-size: 12px;
|
||||
line-height: 24px;
|
||||
height: 24px;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.select-filed {
|
||||
/*width: 100%;*/
|
||||
margin-left: 10px;
|
||||
margin-right: 10px;
|
||||
overflow: hidden; /*超出部分隐藏*/
|
||||
white-space: nowrap; /*不换行*/
|
||||
text-overflow: ellipsis; /*超出部分文字以...显示*/
|
||||
color: #3d4d66;
|
||||
font-size: 12px;
|
||||
line-height: 35px;
|
||||
height: 35px;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
::v-deep .el-popover {
|
||||
height: 200px;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
</style>
|
||||
|
@ -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',
|
||||
|
@ -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',
|
||||
|
@ -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',
|
||||
|
@ -122,6 +122,7 @@
|
||||
:command="beforeDateStyle('H_m_s')"
|
||||
divided
|
||||
>{{ $t('chart.H_m_s') }}</el-dropdown-item>
|
||||
<el-dropdown-item :command="beforeDateStyle('y_M_d_H')">{{ $t('chart.y_M_d_H') }}</el-dropdown-item>
|
||||
<el-dropdown-item :command="beforeDateStyle('y_M_d_H_m')">{{ $t('chart.y_M_d_H_m') }}</el-dropdown-item>
|
||||
<el-dropdown-item :command="beforeDateStyle('y_M_d_H_m_s')">{{ $t('chart.y_M_d_H_m_s') }}</el-dropdown-item>
|
||||
</el-dropdown-menu>
|
||||
|
@ -130,6 +130,7 @@
|
||||
:command="beforeDateStyle('H_m_s')"
|
||||
divided
|
||||
>{{ $t('chart.H_m_s') }}</el-dropdown-item>
|
||||
<el-dropdown-item :command="beforeDateStyle('y_M_d_H')">{{ $t('chart.y_M_d_H') }}</el-dropdown-item>
|
||||
<el-dropdown-item :command="beforeDateStyle('y_M_d_H_m')">{{ $t('chart.y_M_d_H_m') }}</el-dropdown-item>
|
||||
<el-dropdown-item :command="beforeDateStyle('y_M_d_H_m_s')">{{ $t('chart.y_M_d_H_m_s') }}</el-dropdown-item>
|
||||
</el-dropdown-menu>
|
||||
|
@ -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,
|
||||
|
@ -14,4 +14,6 @@ public class LoginLimitInfo {
|
||||
private String scanCreateUser;
|
||||
|
||||
private String multiLogin;
|
||||
|
||||
private String lockedEmail = "false";
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user