提交 5ff006d3 authored 作者: hzh's avatar hzh

登录日志修改

上级 f735339a
...@@ -36,6 +36,11 @@ public class RemoteLogininforBo implements Serializable { ...@@ -36,6 +36,11 @@ public class RemoteLogininforBo implements Serializable {
*/ */
private String userName; private String userName;
/**
* 用户类型
*/
private String userType;
/** /**
* 客户端 * 客户端
*/ */
......
...@@ -75,6 +75,7 @@ public class UserActionListener implements SaTokenListener { ...@@ -75,6 +75,7 @@ public class UserActionListener implements SaTokenListener {
logininforEvent.setTenantId(tenantId); logininforEvent.setTenantId(tenantId);
logininforEvent.setUsername(username); logininforEvent.setUsername(username);
logininforEvent.setStatus(Constants.LOGIN_SUCCESS); logininforEvent.setStatus(Constants.LOGIN_SUCCESS);
logininforEvent.setUserType((String) loginModel.getExtra(LoginHelper.USER_TYPE));
logininforEvent.setMessage(MessageUtils.message("user.login.success")); logininforEvent.setMessage(MessageUtils.message("user.login.success"));
SpringUtils.context().publishEvent(logininforEvent); SpringUtils.context().publishEvent(logininforEvent);
// 更新登录信息 // 更新登录信息
......
...@@ -126,7 +126,7 @@ public class SysLoginService { ...@@ -126,7 +126,7 @@ public class SysLoginService {
// 超级管理员 登出清除动态租户 // 超级管理员 登出清除动态租户
TenantHelper.clearDynamic(); TenantHelper.clearDynamic();
} }
recordLogininfor(loginUser.getTenantId(), loginUser.getUsername(), Constants.LOGOUT, MessageUtils.message("user.logout.success")); recordLogininfor(loginUser.getTenantId(), loginUser.getUsername(), Constants.LOGOUT, MessageUtils.message("user.logout.success"), loginUser.getUserType());
} catch (NotLoginException ignored) { } catch (NotLoginException ignored) {
} finally { } finally {
try { try {
...@@ -152,7 +152,7 @@ public class SysLoginService { ...@@ -152,7 +152,7 @@ public class SysLoginService {
boolean captchaEnabled = captchaProperties.getEnabled(); boolean captchaEnabled = captchaProperties.getEnabled();
// 验证码开关 // 验证码开关
if (captchaEnabled) { if (captchaEnabled) {
validateCaptcha(tenantId, username, registerBody.getCode(), registerBody.getUuid()); validateCaptcha(tenantId, username, registerBody.getCode(), registerBody.getUuid(), registerBody.getUserType());
} }
// 注册用户信息 // 注册用户信息
...@@ -178,7 +178,7 @@ public class SysLoginService { ...@@ -178,7 +178,7 @@ public class SysLoginService {
.setSystemUserId(userId) .setSystemUserId(userId)
); );
recordLogininfor(tenantId, username, Constants.REGISTER, MessageUtils.message("user.register.success")); recordLogininfor(tenantId, username, Constants.REGISTER, MessageUtils.message("user.register.success"), userType);
} }
/** /**
...@@ -187,17 +187,18 @@ public class SysLoginService { ...@@ -187,17 +187,18 @@ public class SysLoginService {
* @param username 用户名 * @param username 用户名
* @param code 验证码 * @param code 验证码
* @param uuid 唯一标识 * @param uuid 唯一标识
* @param userType 用户类型
*/ */
public void validateCaptcha(String tenantId, String username, String code, String uuid) { public void validateCaptcha(String tenantId, String username, String code, String uuid, String userType) {
String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + StringUtils.blankToDefault(uuid, ""); String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + StringUtils.blankToDefault(uuid, "");
String captcha = RedisUtils.getCacheObject(verifyKey); String captcha = RedisUtils.getCacheObject(verifyKey);
RedisUtils.deleteObject(verifyKey); RedisUtils.deleteObject(verifyKey);
if (captcha == null) { if (captcha == null) {
recordLogininfor(tenantId, username, Constants.REGISTER, MessageUtils.message("user.jcaptcha.expire")); recordLogininfor(tenantId, username, Constants.REGISTER, MessageUtils.message("user.jcaptcha.expire"), userType);
throw new CaptchaExpireException(); throw new CaptchaExpireException();
} }
if (!code.equalsIgnoreCase(captcha)) { if (!code.equalsIgnoreCase(captcha)) {
recordLogininfor(tenantId, username, Constants.REGISTER, MessageUtils.message("user.jcaptcha.error")); recordLogininfor(tenantId, username, Constants.REGISTER, MessageUtils.message("user.jcaptcha.error"), userType);
throw new CaptchaException(); throw new CaptchaException();
} }
} }
...@@ -210,20 +211,21 @@ public class SysLoginService { ...@@ -210,20 +211,21 @@ public class SysLoginService {
* @param message 消息内容 * @param message 消息内容
* @return * @return
*/ */
public void recordLogininfor(String tenantId, String username, String status, String message) { public void recordLogininfor(String tenantId, String username, String status, String message, String userType) {
// 封装对象 // 封装对象
LogininforEvent logininforEvent = new LogininforEvent(); LogininforEvent logininforEvent = new LogininforEvent();
logininforEvent.setTenantId(tenantId); logininforEvent.setTenantId(tenantId);
logininforEvent.setUsername(username); logininforEvent.setUsername(username);
logininforEvent.setStatus(status); logininforEvent.setStatus(status);
logininforEvent.setMessage(message); logininforEvent.setMessage(message);
logininforEvent.setUserType(userType);
SpringUtils.context().publishEvent(logininforEvent); SpringUtils.context().publishEvent(logininforEvent);
} }
/** /**
* 登录校验 * 登录校验
*/ */
public void checkLogin(LoginType loginType, String tenantId, String username, Supplier<Boolean> supplier) { public void checkLogin(LoginType loginType, String tenantId, String userType, String username, Supplier<Boolean> supplier) {
String errorKey = CacheConstants.PWD_ERR_CNT_KEY + username; String errorKey = CacheConstants.PWD_ERR_CNT_KEY + username;
String loginFail = Constants.LOGIN_FAIL; String loginFail = Constants.LOGIN_FAIL;
Integer maxRetryCount = userPasswordProperties.getMaxRetryCount(); Integer maxRetryCount = userPasswordProperties.getMaxRetryCount();
...@@ -233,7 +235,7 @@ public class SysLoginService { ...@@ -233,7 +235,7 @@ public class SysLoginService {
int errorNumber = ObjectUtil.defaultIfNull(RedisUtils.getCacheObject(errorKey), 0); int errorNumber = ObjectUtil.defaultIfNull(RedisUtils.getCacheObject(errorKey), 0);
// 锁定时间内登录 则踢出 // 锁定时间内登录 则踢出
if (errorNumber >= maxRetryCount) { if (errorNumber >= maxRetryCount) {
recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime)); recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime), userType);
throw new UserException(loginType.getRetryLimitExceed(), maxRetryCount, lockTime); throw new UserException(loginType.getRetryLimitExceed(), maxRetryCount, lockTime);
} }
...@@ -243,11 +245,11 @@ public class SysLoginService { ...@@ -243,11 +245,11 @@ public class SysLoginService {
RedisUtils.setCacheObject(errorKey, errorNumber, Duration.ofMinutes(lockTime)); RedisUtils.setCacheObject(errorKey, errorNumber, Duration.ofMinutes(lockTime));
// 达到规定错误次数 则锁定登录 // 达到规定错误次数 则锁定登录
if (errorNumber >= maxRetryCount) { if (errorNumber >= maxRetryCount) {
recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime)); recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime), userType);
throw new UserException(loginType.getRetryLimitExceed(), maxRetryCount, lockTime); throw new UserException(loginType.getRetryLimitExceed(), maxRetryCount, lockTime);
} else { } else {
// 未达到规定错误次数 // 未达到规定错误次数
recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitCount(), errorNumber)); recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitCount(), errorNumber), userType);
throw new UserException(loginType.getRetryLimitCount(), errorNumber); throw new UserException(loginType.getRetryLimitCount(), errorNumber);
} }
} }
......
...@@ -47,9 +47,10 @@ public class EmailAuthStrategy implements IAuthStrategy { ...@@ -47,9 +47,10 @@ public class EmailAuthStrategy implements IAuthStrategy {
String tenantId = loginBody.getTenantId(); String tenantId = loginBody.getTenantId();
String email = loginBody.getEmail(); String email = loginBody.getEmail();
String emailCode = loginBody.getEmailCode(); String emailCode = loginBody.getEmailCode();
String userType = loginBody.getUserType();
LoginUser loginUser = TenantHelper.dynamic(tenantId, () -> { LoginUser loginUser = TenantHelper.dynamic(tenantId, () -> {
LoginUser user = remoteUserService.getUserInfoByEmail(email, tenantId); LoginUser user = remoteUserService.getUserInfoByEmail(email, tenantId);
loginService.checkLogin(LoginType.EMAIL, tenantId, user.getUsername(), () -> !validateEmailCode(tenantId, email, emailCode)); loginService.checkLogin(LoginType.EMAIL, tenantId, userType, user.getUsername(), () -> !validateEmailCode(tenantId, email, emailCode, userType));
return user; return user;
}); });
loginUser.setClientKey(client.getClientKey()); loginUser.setClientKey(client.getClientKey());
...@@ -74,10 +75,10 @@ public class EmailAuthStrategy implements IAuthStrategy { ...@@ -74,10 +75,10 @@ public class EmailAuthStrategy implements IAuthStrategy {
/** /**
* 校验邮箱验证码 * 校验邮箱验证码
*/ */
private boolean validateEmailCode(String tenantId, String email, String emailCode) { private boolean validateEmailCode(String tenantId, String email, String emailCode, String userType) {
String code = RedisUtils.getCacheObject(GlobalConstants.CAPTCHA_CODE_KEY + email); String code = RedisUtils.getCacheObject(GlobalConstants.CAPTCHA_CODE_KEY + email);
if (StringUtils.isBlank(code)) { if (StringUtils.isBlank(code)) {
loginService.recordLogininfor(tenantId, email, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")); loginService.recordLogininfor(tenantId, email, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"), userType);
throw new CaptchaExpireException(); throw new CaptchaExpireException();
} }
return code.equals(emailCode); return code.equals(emailCode);
......
...@@ -61,14 +61,15 @@ public class PasswordAuthStrategy implements IAuthStrategy { ...@@ -61,14 +61,15 @@ public class PasswordAuthStrategy implements IAuthStrategy {
String password = loginBody.getPassword(); String password = loginBody.getPassword();
String code = loginBody.getCode(); String code = loginBody.getCode();
String uuid = loginBody.getUuid(); String uuid = loginBody.getUuid();
String userType = loginBody.getUserType();
// 验证码开关 // 验证码开关
if (captchaProperties.getEnabled()) { if (captchaProperties.getEnabled()) {
validateCaptcha(tenantId, username, code, uuid); validateCaptcha(tenantId, username, code, uuid, userType);
} }
LoginUser loginUser = TenantHelper.dynamic(tenantId, () -> { LoginUser loginUser = TenantHelper.dynamic(tenantId, () -> {
LoginUser user = remoteUserService.getUserInfo(username, null, tenantId, loginBody.getUserType()); LoginUser user = remoteUserService.getUserInfo(username, null, tenantId, loginBody.getUserType());
loginService.checkLogin(LoginType.PASSWORD, tenantId, username, () -> !BCrypt.checkpw(password, user.getPassword())); loginService.checkLogin(LoginType.PASSWORD, tenantId, userType, username, () -> !BCrypt.checkpw(password, user.getPassword()));
return user; return user;
}); });
loginUser.setClientKey(client.getClientKey()); loginUser.setClientKey(client.getClientKey());
...@@ -99,16 +100,16 @@ public class PasswordAuthStrategy implements IAuthStrategy { ...@@ -99,16 +100,16 @@ public class PasswordAuthStrategy implements IAuthStrategy {
* @param code 验证码 * @param code 验证码
* @param uuid 唯一标识 * @param uuid 唯一标识
*/ */
private void validateCaptcha(String tenantId, String username, String code, String uuid) { private void validateCaptcha(String tenantId, String username, String code, String uuid, String userType) {
String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + StringUtils.blankToDefault(uuid, ""); String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + StringUtils.blankToDefault(uuid, "");
String captcha = RedisUtils.getCacheObject(verifyKey); String captcha = RedisUtils.getCacheObject(verifyKey);
RedisUtils.deleteObject(verifyKey); RedisUtils.deleteObject(verifyKey);
if (captcha == null) { if (captcha == null) {
loginService.recordLogininfor(tenantId, username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")); loginService.recordLogininfor(tenantId, username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"), userType);
throw new CaptchaExpireException(); throw new CaptchaExpireException();
} }
if (!code.equalsIgnoreCase(captcha)) { if (!code.equalsIgnoreCase(captcha)) {
loginService.recordLogininfor(tenantId, username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error")); loginService.recordLogininfor(tenantId, username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error"), userType);
throw new CaptchaException(); throw new CaptchaException();
} }
} }
......
...@@ -47,9 +47,10 @@ public class SmsAuthStrategy implements IAuthStrategy { ...@@ -47,9 +47,10 @@ public class SmsAuthStrategy implements IAuthStrategy {
String tenantId = loginBody.getTenantId(); String tenantId = loginBody.getTenantId();
String phonenumber = loginBody.getPhonenumber(); String phonenumber = loginBody.getPhonenumber();
String smsCode = loginBody.getSmsCode(); String smsCode = loginBody.getSmsCode();
String userType = loginBody.getUserType();
LoginUser loginUser = TenantHelper.dynamic(tenantId, () -> { LoginUser loginUser = TenantHelper.dynamic(tenantId, () -> {
LoginUser user = remoteUserService.getUserInfoByPhonenumber(phonenumber, tenantId); LoginUser user = remoteUserService.getUserInfoByPhonenumber(phonenumber, tenantId);
loginService.checkLogin(LoginType.SMS, tenantId, user.getUsername(), () -> !validateSmsCode(tenantId, phonenumber, smsCode)); loginService.checkLogin(LoginType.SMS, tenantId, userType, user.getUsername(), () -> !validateSmsCode(tenantId, phonenumber, smsCode, userType));
return user; return user;
}); });
loginUser.setClientKey(client.getClientKey()); loginUser.setClientKey(client.getClientKey());
...@@ -74,10 +75,10 @@ public class SmsAuthStrategy implements IAuthStrategy { ...@@ -74,10 +75,10 @@ public class SmsAuthStrategy implements IAuthStrategy {
/** /**
* 校验短信验证码 * 校验短信验证码
*/ */
private boolean validateSmsCode(String tenantId, String phonenumber, String smsCode) { private boolean validateSmsCode(String tenantId, String phonenumber, String smsCode, String userType) {
String code = RedisUtils.getCacheObject(GlobalConstants.CAPTCHA_CODE_KEY + phonenumber); String code = RedisUtils.getCacheObject(GlobalConstants.CAPTCHA_CODE_KEY + phonenumber);
if (StringUtils.isBlank(code)) { if (StringUtils.isBlank(code)) {
loginService.recordLogininfor(tenantId, phonenumber, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")); loginService.recordLogininfor(tenantId, phonenumber, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"), userType);
throw new CaptchaExpireException(); throw new CaptchaExpireException();
} }
return code.equals(smsCode); return code.equals(smsCode);
......
...@@ -63,6 +63,7 @@ public class LogEventListener { ...@@ -63,6 +63,7 @@ public class LogEventListener {
s.append(getBlock(ip)); s.append(getBlock(ip));
s.append(address); s.append(address);
s.append(getBlock(logininforEvent.getUsername())); s.append(getBlock(logininforEvent.getUsername()));
s.append(getBlock(logininforEvent.getUserType()));
s.append(getBlock(logininforEvent.getStatus())); s.append(getBlock(logininforEvent.getStatus()));
s.append(getBlock(logininforEvent.getMessage())); s.append(getBlock(logininforEvent.getMessage()));
// 打印信息到日志 // 打印信息到日志
...@@ -83,6 +84,7 @@ public class LogEventListener { ...@@ -83,6 +84,7 @@ public class LogEventListener {
logininfor.setLoginLocation(address); logininfor.setLoginLocation(address);
logininfor.setBrowser(browser); logininfor.setBrowser(browser);
logininfor.setOs(os); logininfor.setOs(os);
logininfor.setUserType(logininforEvent.getUserType());
logininfor.setMsg(logininforEvent.getMessage()); logininfor.setMsg(logininforEvent.getMessage());
// 日志状态 // 日志状态
if (StringUtils.equalsAny(logininforEvent.getStatus(), Constants.LOGIN_SUCCESS, Constants.LOGOUT, Constants.REGISTER)) { if (StringUtils.equalsAny(logininforEvent.getStatus(), Constants.LOGIN_SUCCESS, Constants.LOGOUT, Constants.REGISTER)) {
......
...@@ -27,6 +27,11 @@ public class LogininforEvent implements Serializable { ...@@ -27,6 +27,11 @@ public class LogininforEvent implements Serializable {
*/ */
private String username; private String username;
/**
* 用户类型
*/
private String userType;
/** /**
* 登录状态 0成功 1失败 * 登录状态 0成功 1失败
*/ */
......
...@@ -43,6 +43,7 @@ public class LoginHelper { ...@@ -43,6 +43,7 @@ public class LoginHelper {
public static final String YS_USER_ID = "ysUserId"; public static final String YS_USER_ID = "ysUserId";
public static final String OPEN_ID = "openId"; public static final String OPEN_ID = "openId";
public static final String MEMBER_ID = "memberId"; public static final String MEMBER_ID = "memberId";
public static final String USER_TYPE = "userType";
/** /**
* 登录系统 基于 设备类型 * 登录系统 基于 设备类型
...@@ -60,6 +61,7 @@ public class LoginHelper { ...@@ -60,6 +61,7 @@ public class LoginHelper {
.setExtra(DEPT_KEY, loginUser.getDeptId()) .setExtra(DEPT_KEY, loginUser.getDeptId())
.setExtra(DEPT_NAME_KEY, loginUser.getDeptName()) .setExtra(DEPT_NAME_KEY, loginUser.getDeptName())
.setExtra(DEPT_CATEGORY_KEY, loginUser.getDeptCategory()) .setExtra(DEPT_CATEGORY_KEY, loginUser.getDeptCategory())
.setExtra(USER_TYPE, loginUser.getUserType())
); );
StpUtil.getTokenSession().set(LOGIN_USER_KEY, loginUser); StpUtil.getTokenSession().set(LOGIN_USER_KEY, loginUser);
} }
...@@ -186,6 +188,13 @@ public class LoginHelper { ...@@ -186,6 +188,13 @@ public class LoginHelper {
return UserType.getUserType(loginType); return UserType.getUserType(loginType);
} }
/**
* 获取用户类型
*/
public static String getUserTypeStr() {
return StpUtil.getLoginIdAsString();
}
/** /**
* 是否为超级管理员 * 是否为超级管理员
* *
......
...@@ -26,7 +26,7 @@ public class SensitiveServiceImpl implements SensitiveService { ...@@ -26,7 +26,7 @@ public class SensitiveServiceImpl implements SensitiveService {
if (!LoginHelper.isLogin()) { if (!LoginHelper.isLogin()) {
return true; return true;
} }
if (StringUtils.equals(LoginHelper.getUserType().getUserType(), UserType.APP_USER.getUserType())) { if (StringUtils.equals(LoginHelper.getUserTypeStr(), UserType.APP_USER.getUserType())) {
return false; return false;
} }
boolean roleExist = StringUtils.isNotBlank(roleKey); boolean roleExist = StringUtils.isNotBlank(roleKey);
......
...@@ -94,7 +94,7 @@ public class PayOrderController { ...@@ -94,7 +94,7 @@ public class PayOrderController {
Map<String, String> channelExtras = reqVO.getChannelExtras() == null ? Map<String, String> channelExtras = reqVO.getChannelExtras() == null ?
Maps.newHashMapWithExpectedSize(2) : reqVO.getChannelExtras(); Maps.newHashMapWithExpectedSize(2) : reqVO.getChannelExtras();
channelExtras.put(WalletPayClient.USER_ID_KEY, String.valueOf(LoginHelper.getMemberId())); channelExtras.put(WalletPayClient.USER_ID_KEY, String.valueOf(LoginHelper.getMemberId()));
channelExtras.put(WalletPayClient.USER_TYPE_KEY, String.valueOf(LoginHelper.getUserType())); channelExtras.put(WalletPayClient.USER_TYPE_KEY, LoginHelper.getUserTypeStr());
reqVO.setChannelExtras(channelExtras); reqVO.setChannelExtras(channelExtras);
} }
......
...@@ -66,7 +66,7 @@ public class AppPayOrderController { ...@@ -66,7 +66,7 @@ public class AppPayOrderController {
Map<String, String> channelExtras = reqVO.getChannelExtras() == null ? Map<String, String> channelExtras = reqVO.getChannelExtras() == null ?
Maps.newHashMapWithExpectedSize(2) : reqVO.getChannelExtras(); Maps.newHashMapWithExpectedSize(2) : reqVO.getChannelExtras();
channelExtras.put(WalletPayClient.USER_ID_KEY, String.valueOf(LoginHelper.getMemberId())); channelExtras.put(WalletPayClient.USER_ID_KEY, String.valueOf(LoginHelper.getMemberId()));
channelExtras.put(WalletPayClient.USER_TYPE_KEY, String.valueOf(LoginHelper.getUserType())); channelExtras.put(WalletPayClient.USER_TYPE_KEY, LoginHelper.getUserTypeStr());
reqVO.setChannelExtras(channelExtras); reqVO.setChannelExtras(channelExtras);
} }
......
...@@ -37,6 +37,11 @@ public class SysLogininfor implements Serializable { ...@@ -37,6 +37,11 @@ public class SysLogininfor implements Serializable {
*/ */
private String userName; private String userName;
/**
* 用户类型
*/
private String userType;
/** /**
* 客户端 * 客户端
*/ */
......
...@@ -33,6 +33,11 @@ public class SysLogininforBo { ...@@ -33,6 +33,11 @@ public class SysLogininforBo {
*/ */
private String userName; private String userName;
/**
* 用户类型
*/
private String userType;
/** /**
* 客户端 * 客户端
*/ */
......
...@@ -45,6 +45,11 @@ public class SysLogininforVo implements Serializable { ...@@ -45,6 +45,11 @@ public class SysLogininforVo implements Serializable {
@ExcelProperty(value = "用户账号") @ExcelProperty(value = "用户账号")
private String userName; private String userName;
/**
* 用户类型
*/
private String userType;
/** /**
* 客户端 * 客户端
*/ */
......
...@@ -27,7 +27,7 @@ public class SysSensitiveServiceImpl implements SensitiveService { ...@@ -27,7 +27,7 @@ public class SysSensitiveServiceImpl implements SensitiveService {
if (!LoginHelper.isLogin()) { if (!LoginHelper.isLogin()) {
return true; return true;
} }
if (StringUtils.equals(LoginHelper.getUserType().getUserType(), UserType.APP_USER.getUserType())) { if (StringUtils.equals(LoginHelper.getUserTypeStr(), UserType.APP_USER.getUserType())) {
return false; return false;
} }
boolean roleExist = StringUtils.isNotEmpty(roleKey); boolean roleExist = StringUtils.isNotEmpty(roleKey);
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论