diff --git a/.gitignore b/.gitignore
index 96041e9..eb3eb56 100644
--- a/.gitignore
+++ b/.gitignore
@@ -32,3 +32,6 @@ build/
### VS Code ###
.vscode/
+
+### bak ###
+*.bak
diff --git a/plusone-basic/plusone-basic-application/src/main/java/xyz/zhouxy/plusone/exception/config/PlusoneExceptionHandlerConfig.java b/plusone-basic/plusone-basic-application/src/main/java/xyz/zhouxy/plusone/exception/config/PlusoneExceptionHandlerConfig.java
index 7a06b84..fd871aa 100644
--- a/plusone-basic/plusone-basic-application/src/main/java/xyz/zhouxy/plusone/exception/config/PlusoneExceptionHandlerConfig.java
+++ b/plusone-basic/plusone-basic-application/src/main/java/xyz/zhouxy/plusone/exception/config/PlusoneExceptionHandlerConfig.java
@@ -4,6 +4,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
+import xyz.zhouxy.plusone.constant.ErrorCodeConsts;
import xyz.zhouxy.plusone.exception.handler.BaseExceptionHandler.ExceptionInfoHolder;
@Configuration
@@ -12,6 +13,6 @@ public class PlusoneExceptionHandlerConfig {
@Bean
@ConditionalOnMissingBean
ExceptionInfoHolder exceptionInfoHolder() {
- return new ExceptionInfoHolder();
+ return new ExceptionInfoHolder(ErrorCodeConsts.DEFAULT_ERROR_CODE);
}
}
diff --git a/plusone-basic/plusone-basic-application/src/main/java/xyz/zhouxy/plusone/exception/handler/AllExceptionHandler.java b/plusone-basic/plusone-basic-application/src/main/java/xyz/zhouxy/plusone/exception/handler/AllExceptionHandler.java
deleted file mode 100644
index 00fb1e4..0000000
--- a/plusone-basic/plusone-basic-application/src/main/java/xyz/zhouxy/plusone/exception/handler/AllExceptionHandler.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package xyz.zhouxy.plusone.exception.handler;
-
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.ExceptionHandler;
-import org.springframework.web.bind.annotation.RestControllerAdvice;
-
-import lombok.extern.slf4j.Slf4j;
-import xyz.zhouxy.plusone.util.RestfulResult;
-
-/**
- * 处理所有异常的处理器
- *
- * @author ZhouXY
- */
-@ConditionalOnProperty(prefix = "plusone.exception", name = "handle-all-exception", havingValue = "true")
-@RestControllerAdvice
-@Slf4j
-public class AllExceptionHandler extends BaseExceptionHandler {
- protected AllExceptionHandler(ExceptionInfoHolder exceptionInfoHolder) {
- super(exceptionInfoHolder);
- }
-
- @ExceptionHandler(Exception.class)
- public ResponseEntity handleException(Throwable e) {
- log.error(e.getMessage(), e);
- return this.buildExceptionResponse(e);
- }
-}
diff --git a/plusone-basic/plusone-basic-application/src/main/java/xyz/zhouxy/plusone/exception/handler/AllExceptionHandlerConfig.java b/plusone-basic/plusone-basic-application/src/main/java/xyz/zhouxy/plusone/exception/handler/AllExceptionHandlerConfig.java
new file mode 100644
index 0000000..fd05fdb
--- /dev/null
+++ b/plusone-basic/plusone-basic-application/src/main/java/xyz/zhouxy/plusone/exception/handler/AllExceptionHandlerConfig.java
@@ -0,0 +1,20 @@
+package xyz.zhouxy.plusone.exception.handler;
+
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import xyz.zhouxy.plusone.exception.handler.BaseExceptionHandler.ExceptionInfoHolder;
+
+/**
+ * AllExceptionHandlerConfig
+ */
+@Configuration
+@ConditionalOnProperty(prefix = "plusone.exception", name = "handle-all-exception", havingValue = "true")
+public class AllExceptionHandlerConfig {
+
+ @Bean
+ AllExceptionHandler getAllExceptionHandler(ExceptionInfoHolder exceptionInfoHolder) {
+ return new AllExceptionHandler(exceptionInfoHolder);
+ }
+}
diff --git a/plusone-basic/plusone-basic-application/src/main/java/xyz/zhouxy/plusone/exception/handler/DefaultExceptionHandler.java b/plusone-basic/plusone-basic-application/src/main/java/xyz/zhouxy/plusone/exception/handler/DefaultExceptionHandler.java
index e991bb8..af53870 100644
--- a/plusone-basic/plusone-basic-application/src/main/java/xyz/zhouxy/plusone/exception/handler/DefaultExceptionHandler.java
+++ b/plusone-basic/plusone-basic-application/src/main/java/xyz/zhouxy/plusone/exception/handler/DefaultExceptionHandler.java
@@ -55,7 +55,11 @@ public class DefaultExceptionHandler extends BaseExceptionHandler {
HttpStatus.BAD_REQUEST);
}
- @ExceptionHandler(Exception.class)
+ @ExceptionHandler({
+ IllegalArgumentException.class,
+ DataAccessException.class,
+ MethodArgumentNotValidException.class
+ })
public ResponseEntity handleException(Exception e) {
log.error(e.getMessage(), e);
return buildExceptionResponse(e);
diff --git a/plusone-basic/plusone-basic-common/pom.xml b/plusone-basic/plusone-basic-common/pom.xml
index f48323f..14aa305 100644
--- a/plusone-basic/plusone-basic-common/pom.xml
+++ b/plusone-basic/plusone-basic-common/pom.xml
@@ -38,9 +38,14 @@
xyz.zhouxy.plusone
- plusone-exception-handler
+ plusone-validator
0.0.1-SNAPSHOT
+
+ xyz.zhouxy.plusone
+ plusone-exception-handler
+ 0.0.5-SNAPSHOT
+
diff --git a/plusone-basic/plusone-basic-common/src/main/java/xyz/zhouxy/plusone/constant/ErrorCodeConsts.java b/plusone-basic/plusone-basic-common/src/main/java/xyz/zhouxy/plusone/constant/ErrorCodeConsts.java
new file mode 100644
index 0000000..f1958f9
--- /dev/null
+++ b/plusone-basic/plusone-basic-common/src/main/java/xyz/zhouxy/plusone/constant/ErrorCodeConsts.java
@@ -0,0 +1,5 @@
+package xyz.zhouxy.plusone.constant;
+
+public class ErrorCodeConsts {
+ public static final int DEFAULT_ERROR_CODE = 9999999;
+}
diff --git a/plusone-basic/plusone-basic-common/src/main/java/xyz/zhouxy/plusone/exception/InvalidInputException.java b/plusone-basic/plusone-basic-common/src/main/java/xyz/zhouxy/plusone/exception/InvalidInputException.java
deleted file mode 100644
index f2a3be9..0000000
--- a/plusone-basic/plusone-basic-common/src/main/java/xyz/zhouxy/plusone/exception/InvalidInputException.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package xyz.zhouxy.plusone.exception;
-
-import org.springframework.http.HttpStatus;
-import org.springframework.web.bind.annotation.ResponseStatus;
-
-/**
- * 4040200 - 无效的用户输入
- *
- * @author ZhouXY
- */
-@ResponseStatus(HttpStatus.BAD_REQUEST)
-public class InvalidInputException extends PlusoneException {
-
- @java.io.Serial
- private static final long serialVersionUID = 7956661913360059670L;
-
- public static final int ERROR_CODE = 4040200;
-
- private InvalidInputException(int code, String msg) {
- super(code, msg);
- }
-
- private InvalidInputException(int code, Throwable cause) {
- super(code, cause);
- }
-
- private InvalidInputException(int code, String msg, Throwable cause) {
- super(code, msg, cause);
- }
-
- public InvalidInputException(String msg) {
- this(ERROR_CODE, msg);
- }
-
- public InvalidInputException(Throwable cause) {
- this(ERROR_CODE, cause);
- }
-
- public InvalidInputException(String msg, Throwable cause) {
- this(ERROR_CODE, msg, cause);
- }
-
- /**
- * 不支持的 Principal 类型出现时抛出的异常
- */
- public static InvalidInputException unsupportedPrincipalTypeException() {
- return unsupportedPrincipalTypeException("不支持的 PrincipalType");
- }
-
- /**
- * 不支持的 Principal 类型出现时抛出的异常
- */
- public static InvalidInputException unsupportedPrincipalTypeException(String message) {
- return new InvalidInputException(4040201, message);
- }
-}
diff --git a/plusone-basic/plusone-basic-infrastructure/pom.xml b/plusone-basic/plusone-basic-infrastructure/pom.xml
index 0a32200..548d37b 100644
--- a/plusone-basic/plusone-basic-infrastructure/pom.xml
+++ b/plusone-basic/plusone-basic-infrastructure/pom.xml
@@ -49,12 +49,6 @@
spring-boot-starter-validation
-
- org.springframework.boot
- spring-boot-devtools
- runtime
-
-
org.postgresql
postgresql
diff --git a/plusone-basic/plusone-basic-infrastructure/src/main/java/xyz/zhouxy/plusone/sms/TencentSmsServiceImpl.java b/plusone-basic/plusone-basic-infrastructure/src/main/java/xyz/zhouxy/plusone/sms/TencentSmsServiceImpl.java
index 2b79f97..7b7d319 100644
--- a/plusone-basic/plusone-basic-infrastructure/src/main/java/xyz/zhouxy/plusone/sms/TencentSmsServiceImpl.java
+++ b/plusone-basic/plusone-basic-infrastructure/src/main/java/xyz/zhouxy/plusone/sms/TencentSmsServiceImpl.java
@@ -6,9 +6,13 @@ import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.sms.v20210111.SmsClient;
import com.tencentcloudapi.sms.v20210111.models.SendSmsRequest;
+import com.tencentcloudapi.sms.v20210111.models.SendSmsResponse;
+
import org.springframework.stereotype.Service;
import lombok.extern.slf4j.Slf4j;
+import xyz.zhouxy.plusone.constant.ErrorCodeConsts;
+import xyz.zhouxy.plusone.exception.PlusoneException;
/**
* 使用腾讯 SMS 服务
@@ -52,17 +56,17 @@ public class TencentSmsServiceImpl implements SmsService {
* 通过 client 对象调用 SendSms 方法发起请求。注意请求方法名与请求对象是对应的 返回的 res 是一个
* SendSmsResponse 类的实例,与请求对象对应
*/
- // var res = client.SendSms(req);
- client.SendSms(req);
+ var res = client.SendSms(req);
// 输出json格式的字符串回包
- // System.out.println(SendSmsResponse.toJsonString(res));
+ System.out.println(SendSmsResponse.toJsonString(res));
// 也可以取出单个值,你可以通过官网接口文档或跳转到response对象的定义处查看返回字段的定义
// System.out.println(res.getRequestId());
} catch (TencentCloudSDKException e) {
log.error(e.getMessage(), e);
+ throw new PlusoneException(ErrorCodeConsts.DEFAULT_ERROR_CODE, e);
}
}
diff --git a/plusone-basic/plusone-basic-infrastructure/src/main/java/xyz/zhouxy/plusone/validator/BaseValidator.java b/plusone-basic/plusone-basic-infrastructure/src/main/java/xyz/zhouxy/plusone/validator/BaseValidator.java
deleted file mode 100644
index 7a7d9a8..0000000
--- a/plusone-basic/plusone-basic-infrastructure/src/main/java/xyz/zhouxy/plusone/validator/BaseValidator.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package xyz.zhouxy.plusone.validator;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.function.Function;
-import java.util.function.Predicate;
-import java.util.function.Supplier;
-
-import xyz.zhouxy.plusone.exception.InvalidInputException;
-
-/**
- * 校验器
- *
- *
- * 可以使用以下方式初始化一个校验器:
- *
- *
- *
- * BaseValidator<Integer> validator = new BaseValidator<>() {
- * {
- * withRule(value -> Objects.nonNull(value), "value 不能为空");
- * withRule(value -> (value >= 0 && value <= 500), "value 应在 [0, 500] 内");
- * }
- * };
- *
- *
- *
- * 也可以通过继承本类,定义一个校验器(可使用单例模式)。
- *
- *
- *
- * 然后通过校验器的 {@link #validate} 方法,或
- * {@link ValidateUtil#validate(Object, Validator)} 对指定对象进行校验。
- *
- *
- *
- * ValidateUtil.validate(255, validator);
- *
- *
- *
- * validator.validate(666);
- *
- *
- *
- * @author ZhouXY
- * @see IValidateRequired
- * @see ValidateUtil
- * @see Validator
- */
-public abstract class BaseValidator {
-
- private final List> rules = new ArrayList<>();
-
- protected BaseValidator() {
- }
-
- protected final void withRule(Predicate rule, String errorMessage) {
- withRule(rule, () -> new InvalidInputException(errorMessage));
- }
-
- protected final void withRule(Predicate rule, Supplier exceptionCreator) {
- withRule(rule, value -> exceptionCreator.get());
- }
-
- protected final void withRule(Predicate rule, Function exceptionCreator) {
- this.rules.add(new RuleInfo<>(rule, exceptionCreator));
- }
-
- public void validate(T obj) {
- this.rules.forEach(ruleInfo -> ruleInfo.validate(obj));
- }
-
- protected static class RuleInfo {
- private final Predicate rule;
- private final Function exceptionCreator;
-
- private RuleInfo(Predicate rule, Function exceptionCreator) {
- this.rule = rule;
- this.exceptionCreator = exceptionCreator;
- }
-
- private void validate(T obj) {
- if (!rule.test(obj)) {
- throw exceptionCreator.apply(obj);
- }
- }
- }
-}
diff --git a/plusone-basic/plusone-basic-infrastructure/src/main/java/xyz/zhouxy/plusone/validator/IValidateRequired.java b/plusone-basic/plusone-basic-infrastructure/src/main/java/xyz/zhouxy/plusone/validator/IValidateRequired.java
deleted file mode 100644
index 82e98ae..0000000
--- a/plusone-basic/plusone-basic-infrastructure/src/main/java/xyz/zhouxy/plusone/validator/IValidateRequired.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package xyz.zhouxy.plusone.validator;
-
-/**
- * 自带校验方法,校验不通过时直接抛异常。
- *
- * @author ZhouXY
- *
- * @see ValidateUtil
- * @see BaseValidator
- */
-public interface IValidateRequired {
- void validate();
-}
diff --git a/plusone-basic/plusone-basic-infrastructure/src/main/java/xyz/zhouxy/plusone/validator/InvalidInputExceptionHandler.java b/plusone-basic/plusone-basic-infrastructure/src/main/java/xyz/zhouxy/plusone/validator/InvalidInputExceptionHandler.java
new file mode 100644
index 0000000..f987fec
--- /dev/null
+++ b/plusone-basic/plusone-basic-infrastructure/src/main/java/xyz/zhouxy/plusone/validator/InvalidInputExceptionHandler.java
@@ -0,0 +1,15 @@
+package xyz.zhouxy.plusone.validator;
+
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+import xyz.zhouxy.plusone.constant.ErrorCodeConsts;
+import xyz.zhouxy.plusone.exception.handler.BaseExceptionHandler;
+
+@RestControllerAdvice
+public class InvalidInputExceptionHandler extends BaseExceptionHandler {
+
+ protected InvalidInputExceptionHandler() {
+ super(new ExceptionInfoHolder(ErrorCodeConsts.DEFAULT_ERROR_CODE));
+ set(InvalidInputException.class, InvalidInputException.ERROR_CODE, "无效的用户输入");
+ }
+}
diff --git a/plusone-basic/plusone-basic-infrastructure/src/main/java/xyz/zhouxy/plusone/validator/ValidateUtil.java b/plusone-basic/plusone-basic-infrastructure/src/main/java/xyz/zhouxy/plusone/validator/ValidateUtil.java
deleted file mode 100644
index 1a8438d..0000000
--- a/plusone-basic/plusone-basic-infrastructure/src/main/java/xyz/zhouxy/plusone/validator/ValidateUtil.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package xyz.zhouxy.plusone.validator;
-
-/**
- * 校验工具类
- *
- * 对 {@link IValidateRequired} 的实现类对象进行校验
- *
- *
- * @author ZhouXY
- *
- * @see BaseValidator
- * @see Validator
- * @see IValidateRequired
- */
-public class ValidateUtil {
- private ValidateUtil() {
- throw new IllegalStateException("Utility class");
- }
-
- public static void validate(Object obj) {
- if (obj instanceof IValidateRequired) {
- ((IValidateRequired) obj).validate();
- }
- }
-
- public static void validate(T obj, BaseValidator validator) {
- validator.validate(obj);
- }
-}
diff --git a/plusone-basic/plusone-basic-infrastructure/src/main/java/xyz/zhouxy/plusone/validator/Validator.java b/plusone-basic/plusone-basic-infrastructure/src/main/java/xyz/zhouxy/plusone/validator/Validator.java
deleted file mode 100644
index b56ff50..0000000
--- a/plusone-basic/plusone-basic-infrastructure/src/main/java/xyz/zhouxy/plusone/validator/Validator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package xyz.zhouxy.plusone.validator;
-
-import java.util.function.Predicate;
-
-/**
- * 校验器
- *
- *
- * 可以使用以下方式初始化一个校验器:
- *
- *
- *
- * var validator = new Validator<Integer>()
- * .addRule(value -> Objects.nonNull(value), "value 不能为空")
- * .addRule(value -> (value >= 0 && value <= 500), "value 应在 [0, 500] 内");
- *
- *
- *
- * 然后通过校验器的 {@link #validate} 方法,或
- * {@link ValidateUtil#validate(Object, Validator)} 对指定对象进行校验。
- *
- *
- *
- * validator.validate(666);
- *
- *
- *
- * ValidateUtil.validate(255, validator);
- *
- *
- *
- * @author ZhouXY
- * @see IValidateRequired
- * @see ValidateUtil
- * @see BaseValidator
- */
-public final class Validator extends BaseValidator {
- public final Validator addRule(final Predicate rule, final String errorMessage) {
- withRule(rule, errorMessage);
- return this;
- }
-}
diff --git a/plusone-basic/plusone-basic-infrastructure/src/main/java/xyz/zhouxy/plusone/validator/validator2/BaseValidator2.java b/plusone-basic/plusone-basic-infrastructure/src/main/java/xyz/zhouxy/plusone/validator/validator2/BaseValidator2.java
deleted file mode 100644
index 257af16..0000000
--- a/plusone-basic/plusone-basic-infrastructure/src/main/java/xyz/zhouxy/plusone/validator/validator2/BaseValidator2.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package xyz.zhouxy.plusone.validator.validator2;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.function.Function;
-
-public abstract class BaseValidator2 {
-
- private List> valueValidators = new ArrayList<>();
-
- protected final ValueValidator ruleFor(Function getter) {
- ValueValidator validValueHolder = new ValueValidator<>(getter);
- valueValidators.add(validValueHolder);
- return validValueHolder;
- }
-
- public void validate(T obj) {
- for (ValueValidator valueValidator : this.valueValidators) {
- valueValidator.validateProperty(obj);
- }
- }
-}
diff --git a/plusone-basic/plusone-basic-infrastructure/src/main/java/xyz/zhouxy/plusone/validator/validator2/ValueValidator.java b/plusone-basic/plusone-basic-infrastructure/src/main/java/xyz/zhouxy/plusone/validator/validator2/ValueValidator.java
deleted file mode 100644
index 933db5c..0000000
--- a/plusone-basic/plusone-basic-infrastructure/src/main/java/xyz/zhouxy/plusone/validator/validator2/ValueValidator.java
+++ /dev/null
@@ -1,379 +0,0 @@
-package xyz.zhouxy.plusone.validator.validator2;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Objects;
-import java.util.function.Consumer;
-import java.util.function.Function;
-import java.util.function.Predicate;
-import java.util.function.Supplier;
-
-import cn.hutool.core.util.StrUtil;
-import xyz.zhouxy.plusone.constant.RegexConsts;
-import xyz.zhouxy.plusone.exception.InvalidInputException;
-import xyz.zhouxy.plusone.util.RegexUtil;
-
-public class ValueValidator {
- Function getter;
- List> rules = new ArrayList<>();
-
- public ValueValidator(Function getter) {
- this.getter = getter;
- }
-
- private void withRule(Predicate condition,
- Function exceptionCreator) {
- withRule(value -> {
- if (!condition.test(value)) {
- throw exceptionCreator.apply(value);
- }
- });
- }
-
- private void withRule(Consumer rule) {
- this.rules.add(rule);
- }
-
- // ====================
- // ====== Object ======
- // ====================
-
- // ====== notNull =====
-
- public ValueValidator notNull() {
- return notNull("Value could not be null.");
- }
-
- public ValueValidator notNull(String errMsg) {
- return notNull(convertExceptionCreator(errMsg));
- }
-
- public ValueValidator notNull(Supplier exceptionCreator) {
- return notNull(convertExceptionCreator(exceptionCreator));
- }
-
- public ValueValidator notNull(Function exceptionCreator) {
- withRule(Objects::nonNull, exceptionCreator);
- return this;
- }
-
- // ====== isNull =====
-
- public ValueValidator isNull(String errMsg) {
- return isNull(convertExceptionCreator(errMsg));
- }
-
- public ValueValidator isNull(Supplier exceptionCreator) {
- return isNull(convertExceptionCreator(exceptionCreator));
- }
-
- public ValueValidator isNull(Function exceptionCreator) {
- withRule(Objects::isNull, exceptionCreator);
- return this;
- }
-
- // ===== equals =====
-
- public ValueValidator equalsThat(Object that) {
- return equalsThat(that, value -> new InvalidInputException(String.format("(%s) 必须与 (%s) 相等", value, that)));
- }
-
- public ValueValidator equalsThat(Object that, String errMsg) {
- return equalsThat(that, convertExceptionCreator(errMsg));
- }
-
- public ValueValidator equalsThat(
- Object that, Supplier exceptionCreator) {
- return equalsThat(that, convertExceptionCreator(exceptionCreator));
- }
-
- public ValueValidator equalsThat(
- Object that, Function exceptionCreator) {
- withRule(value -> Objects.equals(value, that), exceptionCreator);
- return this;
- }
-
- // ===== state =====
-
- public ValueValidator state(Predicate condition) {
- return state(condition, "无效的用户输入");
- }
-
- public ValueValidator state(Predicate condition, String errMsg) {
- return state(condition, convertExceptionCreator(errMsg));
- }
-
- public ValueValidator state(
- Predicate condition,
- Supplier exceptionCreator) {
- return state(condition, convertExceptionCreator(exceptionCreator));
- }
-
- public ValueValidator state(
- Predicate condition,
- Function exceptionCreator) {
- withRule(condition, exceptionCreator);
- return this;
- }
-
- // =================
- // ====== int ======
- // =================
-
- public ValueValidator between(int min, int max) {
- return between(min, max, String.format("数值不在 %s 和 %s 之间", String.valueOf(min), String.valueOf(max)));
- }
-
- public ValueValidator between(int min, int max, String errMsg) {
- return between(min, max, convertExceptionCreator(errMsg));
- }
-
- public ValueValidator between(int min, int max,
- Supplier exceptionCreator) {
- return between(min, max, convertExceptionCreator(exceptionCreator));
- }
-
- public ValueValidator between(int min, int max,
- Function exceptionCreator) {
- withRule(value -> ((int) value >= min && (int) value < max), exceptionCreator);
- return this;
- }
-
- // ====================
- // ====== double ======
- // ====================
-
- public ValueValidator between(double min, double max) {
- return between(min, max, String.format("数值不在 %s 和 %s 之间", String.valueOf(min), String.valueOf(max)));
- }
-
- public ValueValidator between(double min, double max, String errMsg) {
- return between(min, max, convertExceptionCreator(errMsg));
- }
-
- public ValueValidator between(double min, double max,
- Supplier exceptionCreator) {
- return between(min, max, convertExceptionCreator(exceptionCreator));
- }
-
- public ValueValidator between(double min, double max,
- Function exceptionCreator) {
- withRule(value -> ((double) value >= min && (double) value < max), exceptionCreator);
- return this;
- }
-
- // ================================
- // ====== Collection, String ======
- // ================================
-
- // ====== notEmpty =====
-
- public ValueValidator notEmpty(String errMsg) {
- return notEmpty(convertExceptionCreator(errMsg));
- }
-
- public ValueValidator notEmpty(Supplier exceptionCreator) {
- return notEmpty(convertExceptionCreator(exceptionCreator));
- }
-
- public ValueValidator notEmpty(Function exceptionCreator) {
- withRule(value -> {
- if (value == null) {
- return false;
- }
- if (value instanceof Collection) {
- return !((Collection>) value).isEmpty();
- }
- if (value instanceof String) {
- return !((String) value).isEmpty();
- }
- return false;
- }, exceptionCreator);
- return this;
- }
-
- // ====== isEmpty =====
-
- public ValueValidator isEmpty(String errMsg) {
- return isEmpty(convertExceptionCreator(errMsg));
- }
-
- public ValueValidator isEmpty(Supplier exceptionCreator) {
- return isEmpty(convertExceptionCreator(exceptionCreator));
- }
-
- public ValueValidator isEmpty(Function exceptionCreator) {
- withRule(value -> {
- if (value == null) {
- return false;
- }
- if (value instanceof Collection) {
- return ((Collection>) value).isEmpty();
- }
- if (value instanceof String) {
- return ((String) value).isEmpty();
- }
- return false;
- }, exceptionCreator);
- return this;
- }
-
- // =====================
- // ====== boolean ======
- // =====================
-
- // ====== isTrue ======
-
- public ValueValidator isTrue() {
- return isTrue("The value must be true.");
- }
-
- public ValueValidator isTrue(String errMsg) {
- return isTrue(convertExceptionCreator(errMsg));
- }
-
- public ValueValidator isTrue(Supplier exceptionCreator) {
- return isTrue(convertExceptionCreator(exceptionCreator));
- }
-
- public ValueValidator isTrue(Function exceptionCreator) {
- withRule(Boolean.TRUE::equals, exceptionCreator);
- return this;
- }
-
- // ====== isFalse ======
-
- public ValueValidator isFalse() {
- return isFalse("The value must be false.");
- }
-
- public ValueValidator isFalse(String errMsg) {
- return isFalse(convertExceptionCreator(errMsg));
- }
-
- public ValueValidator isFalse(Supplier exceptionCreator) {
- return isFalse(convertExceptionCreator(exceptionCreator));
- }
-
- public ValueValidator isFalse(Function exceptionCreator) {
- withRule(Boolean.FALSE::equals, exceptionCreator);
- return this;
- }
-
- // ====================
- // ====== String ======
- // ====================
-
- // ===== matches =====
-
- public ValueValidator matches(String regex, String errMsg) {
- return matches(regex, convertExceptionCreator(errMsg));
- }
-
- public ValueValidator matches(
- String regex,
- Supplier exceptionCreator) {
- return matches(regex, convertExceptionCreator(exceptionCreator));
- }
-
- public ValueValidator matches(
- String regex,
- Function exceptionCreator) {
- withRule(input -> RegexUtil.matches((String) input, regex), exceptionCreator);
- return this;
- }
-
- // ===== matchesOr =====
-
- public ValueValidator matchesOr(String[] regexs, String errMsg) {
- return matchesOr(regexs, convertExceptionCreator(errMsg));
- }
-
- public ValueValidator matchesOr(
- String[] regexs,
- Supplier exceptionCreator) {
- return matchesOr(regexs, convertExceptionCreator(exceptionCreator));
- }
-
- public ValueValidator matchesOr(
- String[] regexs,
- Function exceptionCreator) {
- withRule(input -> RegexUtil.matchesOr((String) input, regexs), exceptionCreator);
- return this;
- }
-
- // ===== matchesAnd =====
-
- public ValueValidator matchesAnd(String[] regexs, String errMsg) {
- return matchesAnd(regexs, convertExceptionCreator(errMsg));
- }
-
- public ValueValidator matchesAnd(
- String[] regexs,
- Supplier exceptionCreator) {
- return matchesAnd(regexs, convertExceptionCreator(exceptionCreator));
- }
-
- public ValueValidator matchesAnd(
- String[] regexs,
- Function exceptionCreator) {
- withRule(input -> RegexUtil.matchesAnd((String) input, regexs), exceptionCreator);
- return this;
- }
-
- // ===== notBlank =====
-
- public ValueValidator notBlank() {
- return notBlank("This String argument must have text; it must not be null, empty, or blank");
- }
-
- public ValueValidator notBlank(String errMsg) {
- return notBlank(convertExceptionCreator(errMsg));
- }
-
- public ValueValidator notBlank(Supplier exceptionCreator) {
- return notBlank(convertExceptionCreator(exceptionCreator));
- }
-
- public ValueValidator notBlank(Function exceptionCreator) {
- withRule(input -> StrUtil.isNotBlank((String) input), exceptionCreator);
- return this;
- }
-
- // ===== email =====
-
- public ValueValidator email() {
- return email("The value is not an email address.");
- }
-
- public ValueValidator email(String errMsg) {
- return email(convertExceptionCreator(errMsg));
- }
-
- public ValueValidator email(Supplier exceptionCreator) {
- return email(convertExceptionCreator(exceptionCreator));
- }
-
- public ValueValidator email(Function exceptionCreator) {
- return matches(RegexConsts.EMAIL, exceptionCreator);
- }
-
- // ========================================================================
-
- void validateProperty(DTO obj) {
- PROPERTY value = this.getter.apply(obj);
- for (var rule : this.rules) {
- rule.accept(value);
- }
- }
-
- private static Function convertExceptionCreator(String errMsg) {
- return convertExceptionCreator(errMsg);
- }
-
- private static Function convertExceptionCreator(
- Supplier exceptionSupplier) {
- return value -> exceptionSupplier.get();
- }
-}
diff --git a/plusone-basic/plusone-basic-infrastructure/src/test/java/xyz/zhouxy/plusone/validatortest/BaseValidator2Test.java b/plusone-basic/plusone-basic-infrastructure/src/test/java/xyz/zhouxy/plusone/validatortest/BaseValidator2Test.java
index 7a963d8..e908fe1 100644
--- a/plusone-basic/plusone-basic-infrastructure/src/test/java/xyz/zhouxy/plusone/validatortest/BaseValidator2Test.java
+++ b/plusone-basic/plusone-basic-infrastructure/src/test/java/xyz/zhouxy/plusone/validatortest/BaseValidator2Test.java
@@ -32,10 +32,10 @@ class LoginCommandValidator extends BaseValidator2 {
public static final LoginCommandValidator INSTANCE = new LoginCommandValidator();
private LoginCommandValidator() {
- ruleFor(loginCommand -> loginCommand.getAccount())
+ ruleFor(LoginCommand::getAccount)
.notNull("邮箱地址不能为空")
.matchesOr(new String[] { RegexConsts.EMAIL, RegexConsts.MOBILE_PHONE }, value -> new RuntimeException('"' + value + "\" 不是邮箱地址或手机号"));
- ruleFor(loginCommand -> loginCommand.getPwd())
+ ruleFor(LoginCommand::getPwd)
.notNull("密码不能为空")
.notEmpty("密码不能为空")
.matches(RegexConsts.PASSWORD, "密码格式错误");
diff --git a/plusone-start/src/main/resources/META-INF/spring-devtools.properties b/plusone-start/src/main/resources/META-INF/spring-devtools.properties
new file mode 100644
index 0000000..d587606
--- /dev/null
+++ b/plusone-start/src/main/resources/META-INF/spring-devtools.properties
@@ -0,0 +1 @@
+restart.include.projectcommon=/plusone-[\\w\\.\\-]+\\.jar
diff --git a/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/common/util/PrincipalUtil.java b/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/common/util/PrincipalUtil.java
index 6e820f7..da05d59 100644
--- a/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/common/util/PrincipalUtil.java
+++ b/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/common/util/PrincipalUtil.java
@@ -2,11 +2,11 @@ package xyz.zhouxy.plusone.system.application.common.util;
import javax.annotation.Nullable;
-import xyz.zhouxy.plusone.exception.InvalidInputException;
import xyz.zhouxy.plusone.system.domain.model.account.Email;
import xyz.zhouxy.plusone.system.domain.model.account.MobilePhone;
import xyz.zhouxy.plusone.system.domain.model.account.Principal;
import xyz.zhouxy.plusone.system.domain.model.account.Username;
+import xyz.zhouxy.plusone.validator.InvalidInputException;
/**
* 根据字面值,判断并生成 {@link Principal} 值对象。
diff --git a/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/controller/AccountContextController.java b/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/controller/AccountContextController.java
index b1aa866..4518373 100644
--- a/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/controller/AccountContextController.java
+++ b/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/controller/AccountContextController.java
@@ -3,10 +3,13 @@ package xyz.zhouxy.plusone.system.application.controller;
import static xyz.zhouxy.plusone.system.constant.AuthLogic.adminAuthLogic;
import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import xyz.zhouxy.plusone.system.application.service.AccountContextService;
+import xyz.zhouxy.plusone.system.application.service.command.ChangePasswordCommand;
+import xyz.zhouxy.plusone.system.application.service.command.ChangePasswordWithoutLoginCommand;
import xyz.zhouxy.plusone.util.RestfulResult;
/**
@@ -31,10 +34,28 @@ public class AccountContextController {
return RestfulResult.success("查询成功", result);
}
+ @GetMapping("logout")
+ public RestfulResult logout() {
+ service.logout();
+ return RestfulResult.success("注销成功");
+ }
+
@GetMapping("menus")
public RestfulResult getMenuTree() {
adminAuthLogic.checkLogin();
var result = service.getMenuTree();
return RestfulResult.success("查询成功", result);
}
+
+ @PostMapping("changePassword")
+ public RestfulResult changePassword(ChangePasswordCommand command) {
+ service.changePassword(command);
+ return RestfulResult.success("修改成功,请重新登录。");
+ }
+
+ @PostMapping("changePasswordWithoutLogin")
+ public RestfulResult changePasswordWithoutLogin(ChangePasswordWithoutLoginCommand command) {
+ service.changePasswordWithoutLogin(command);
+ return RestfulResult.success("修改成功,请重新登录。");
+ }
}
diff --git a/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/controller/AdminLogoutController.java b/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/controller/AdminLogoutController.java
deleted file mode 100644
index a7c1a81..0000000
--- a/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/controller/AdminLogoutController.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package xyz.zhouxy.plusone.system.application.controller;
-
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import xyz.zhouxy.plusone.system.application.service.AdminLogoutService;
-import xyz.zhouxy.plusone.util.RestfulResult;
-
-/**
- * Admin 账号登出
- *
- * @author ZhouXY
- */
-@RestController
-@RequestMapping("logout")
-public class AdminLogoutController {
-
- private final AdminLogoutService service;
-
- public AdminLogoutController(AdminLogoutService service) {
- this.service = service;
- }
-
- @GetMapping
- public RestfulResult execute() {
- service.execute();
- return RestfulResult.success("注销成功");
- }
-}
diff --git a/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/exception/UnsupportedMenuTypeException.java b/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/exception/UnsupportedMenuTypeException.java
index 993d936..429246b 100644
--- a/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/exception/UnsupportedMenuTypeException.java
+++ b/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/exception/UnsupportedMenuTypeException.java
@@ -1,6 +1,6 @@
package xyz.zhouxy.plusone.system.application.exception;
-import xyz.zhouxy.plusone.exception.InvalidInputException;
+import xyz.zhouxy.plusone.validator.InvalidInputException;
public class UnsupportedMenuTypeException extends InvalidInputException {
diff --git a/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/exception/handler/SaTokenExceptionHandler.java b/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/exception/handler/SaTokenExceptionHandler.java
index 79d91bf..e216e16 100644
--- a/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/exception/handler/SaTokenExceptionHandler.java
+++ b/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/exception/handler/SaTokenExceptionHandler.java
@@ -6,13 +6,13 @@ import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import cn.dev33.satoken.exception.DisableServiceException;
-import cn.dev33.satoken.exception.SameTokenInvalidException;
import cn.dev33.satoken.exception.NotBasicAuthException;
import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.exception.NotPermissionException;
import cn.dev33.satoken.exception.NotRoleException;
import cn.dev33.satoken.exception.NotSafeException;
import cn.dev33.satoken.exception.SaTokenException;
+import cn.dev33.satoken.exception.SameTokenInvalidException;
import lombok.extern.slf4j.Slf4j;
import xyz.zhouxy.plusone.exception.handler.BaseExceptionHandler;
import xyz.zhouxy.plusone.util.RestfulResult;
diff --git a/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/service/AccountContextService.java b/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/service/AccountContextService.java
index e6e8996..b40d60c 100644
--- a/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/service/AccountContextService.java
+++ b/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/service/AccountContextService.java
@@ -1,38 +1,102 @@
package xyz.zhouxy.plusone.system.application.service;
-import static xyz.zhouxy.plusone.system.constant.AuthLogic.adminAuthLogic;
+import xyz.zhouxy.plusone.system.constant.AuthLogic;
import java.util.List;
-import org.springframework.stereotype.Service;
+import javax.annotation.Resource;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import cn.dev33.satoken.stp.StpLogic;
+import cn.hutool.core.lang.Assert;
+import xyz.zhouxy.plusone.system.application.common.util.PrincipalUtil;
+import xyz.zhouxy.plusone.system.application.exception.AccountLoginException;
import xyz.zhouxy.plusone.system.application.query.AccountQueries;
import xyz.zhouxy.plusone.system.application.query.result.AccountDetails;
import xyz.zhouxy.plusone.system.application.query.result.MenuViewObject;
+import xyz.zhouxy.plusone.system.application.service.command.ChangePasswordByOtpCommand;
+import xyz.zhouxy.plusone.system.application.service.command.ChangePasswordCommand;
+import xyz.zhouxy.plusone.system.application.service.command.ChangePasswordWithoutLoginCommand;
+import xyz.zhouxy.plusone.system.domain.model.account.Account;
+import xyz.zhouxy.plusone.system.domain.model.account.AccountRepository;
+import xyz.zhouxy.plusone.system.domain.model.account.Email;
+import xyz.zhouxy.plusone.system.domain.model.account.MobilePhone;
+import xyz.zhouxy.plusone.system.domain.model.account.Principal;
+import xyz.zhouxy.plusone.validator.InvalidInputException;
/**
- * 账号查询本身相关信息
+ * 账号对当前帐号进行操作
*
* @author ZhouXY
*/
@Service
public class AccountContextService {
- private final AccountQueries accountQueries;
- private final MenuManagementService menuManagementService;
+ private final static StpLogic adminAuthLogic = AuthLogic.adminAuthLogic;
- public AccountContextService(AccountQueries accountQueries, MenuManagementService menuManagementService) {
- this.accountQueries = accountQueries;
- this.menuManagementService = menuManagementService;
- }
+ @Resource
+ private AccountQueries accountQueries;
+ @Resource
+ private MenuManagementService menuManagementService;
+ @Resource
+ private AccountRepository accountRepository;
+ @Resource
+ private MailAndSmsVerifyService mailAndSmsVerifyService;
public AccountDetails getAccountInfo() {
+ adminAuthLogic.checkLogin();
long accountId = adminAuthLogic.getLoginIdAsLong();
return accountQueries.queryAccountDetails(accountId);
}
+ public void logout() {
+ adminAuthLogic.checkLogin();
+ adminAuthLogic.logout();
+ }
+
public List getMenuTree() {
+ adminAuthLogic.checkLogin();
long accountId = adminAuthLogic.getLoginIdAsLong();
return menuManagementService.queryByAccountId(accountId);
}
+
+ @Transactional
+ public void changePassword(ChangePasswordCommand command) {
+ adminAuthLogic.checkLogin();
+ Account account = accountRepository.find(adminAuthLogic.getLoginIdAsLong());
+ account.checkPassword(command.getPassword());
+ account.changePassword(command.getNewPassword(), command.getPasswordConfirmation());
+ accountRepository.save(account);
+ adminAuthLogic.logout();
+ }
+
+ @Transactional
+ public void changePasswordWithoutLogin(ChangePasswordWithoutLoginCommand command) {
+ String principal = command.getAccount();
+ Principal emailOrMobilePhone = PrincipalUtil.getEmailOrMobilePhone(principal);
+
+ Account account = emailOrMobilePhone instanceof Email
+ ? accountRepository.findByEmail((Email) emailOrMobilePhone)
+ : accountRepository.findByMobilePhone((MobilePhone) emailOrMobilePhone);
+ account.checkPassword(command.getOldPassword());
+ account.changePassword(command.getNewPassword(), command.getPasswordConfirmation());
+ accountRepository.save(account);
+ adminAuthLogic.logout();
+ }
+
+ @Transactional
+ public void changePasswordByOtp(ChangePasswordByOtpCommand command) {
+
+ var principal = command.getAccount();
+ Account account = switch (command.getPrincipalType()) {
+ case EMAIL -> accountRepository.findByEmail(Email.of(principal));
+ case MOBILE_PHONE -> accountRepository.findByMobilePhone(MobilePhone.of(principal));
+ default -> throw InvalidInputException.unsupportedPrincipalTypeException("输入邮箱地址或手机号");
+ };
+ Assert.notNull(account, () -> AccountLoginException.accountNotExistException());
+
+ mailAndSmsVerifyService.checkOtp(principal, command.getOtp());
+ }
}
diff --git a/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/service/AdminLoginService.java b/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/service/AdminLoginService.java
index 18cf975..5f12908 100644
--- a/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/service/AdminLoginService.java
+++ b/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/service/AdminLoginService.java
@@ -5,7 +5,7 @@ import static xyz.zhouxy.plusone.system.constant.AuthLogic.adminAuthLogic;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-import xyz.zhouxy.plusone.exception.InvalidInputException;
+import cn.hutool.core.lang.Assert;
import xyz.zhouxy.plusone.system.application.common.util.PrincipalType;
import xyz.zhouxy.plusone.system.application.common.util.PrincipalUtil;
import xyz.zhouxy.plusone.system.application.exception.AccountLoginException;
@@ -17,8 +17,8 @@ import xyz.zhouxy.plusone.system.domain.model.account.Account;
import xyz.zhouxy.plusone.system.domain.model.account.AccountRepository;
import xyz.zhouxy.plusone.system.domain.model.account.Email;
import xyz.zhouxy.plusone.system.domain.model.account.MobilePhone;
-import xyz.zhouxy.plusone.system.domain.model.account.Principal;
import xyz.zhouxy.plusone.system.domain.model.account.Username;
+import xyz.zhouxy.plusone.validator.InvalidInputException;
import xyz.zhouxy.plusone.validator.ValidateDto;
/**
@@ -43,62 +43,45 @@ public class AdminLoginService {
@ValidateDto
public LoginInfoViewObject loginByPassword(LoginByPasswordCommand command) {
- Principal principal = PrincipalUtil.getPrincipal(command.getPrincipal());
- Account account;
- if (principal instanceof Email) {
- account = accountRepository.findByEmail((Email) principal);
- } else if (principal instanceof MobilePhone) {
- account = accountRepository.findByMobilePhone((MobilePhone) principal);
- } else {
- account = accountRepository.findByUsername((Username) principal);
- }
+ var principal = command.getPrincipal();
+ Account account = switch (command.getPrincipalType()) {
+ case USERNAME -> accountRepository.findByUsername(Username.of(principal));
+ case EMAIL -> accountRepository.findByEmail(Email.of(principal));
+ case MOBILE_PHONE -> accountRepository.findByMobilePhone(MobilePhone.of(principal));
+ };
+ Assert.notNull(account, () -> AccountLoginException.accountNotExistException());
+ var isPasswordCorrect = account.checkPassword(command.getPassword());
+ Assert.isTrue(isPasswordCorrect, () -> AccountLoginException.passwordErrorException());
- if (account == null) {
- throw AccountLoginException.accountNotExistException();
- }
- @SuppressWarnings("null")
- boolean isPasswordCorrect = account.checkPassword(command.getPassword());
- if (!isPasswordCorrect) {
- throw AccountLoginException.passwordErrorException();
- }
adminAuthLogic.login(account.getId().orElseThrow(), command.isRememberMe());
-
var accountDetails = accountQueries.queryAccountDetails(account.getId().orElseThrow());
return LoginInfoViewObject.of(adminAuthLogic.getTokenValue(), accountDetails);
}
@ValidateDto
public LoginInfoViewObject loginByOtp(LoginByOtpCommand command) {
- String principal = command.getPrincipal();
- PrincipalType principalType = PrincipalUtil.getPrincipalType(principal);
- String otp = command.getOtp();
- boolean rememberMe = command.isRememberMe();
+ var principal = command.getPrincipal();
+ Account account = switch (command.getPrincipalType()) {
+ case EMAIL -> accountRepository.findByEmail(Email.of(principal));
+ case MOBILE_PHONE -> accountRepository.findByMobilePhone(MobilePhone.of(principal));
+ default -> throw InvalidInputException.unsupportedPrincipalTypeException("输入邮箱地址或手机号");
+ };
+ Assert.notNull(account, () -> AccountLoginException.accountNotExistException());
- Account account;
- if (principalType == PrincipalType.EMAIL) {
- account = accountRepository.findByEmail(Email.of(principal));
- } else if (principalType == PrincipalType.MOBILE_PHONE) {
- account = accountRepository.findByMobilePhone(MobilePhone.of(principal));
- } else {
- throw InvalidInputException.unsupportedPrincipalTypeException("输入邮箱地址或手机号");
- }
+ mailAndSmsVerifyService.checkOtp(principal, command.getOtp());
- if (account == null) {
- throw AccountLoginException.accountNotExistException();
- }
- mailAndSmsVerifyService.checkOtp(principal, otp);
- adminAuthLogic.login(account.getId().orElseThrow(), rememberMe);
+ adminAuthLogic.login(account.getId().orElseThrow(), command.isRememberMe());
var accountDetails = accountQueries.queryAccountDetails(account.getId().orElseThrow());
return LoginInfoViewObject.of(adminAuthLogic.getTokenValue(), accountDetails);
}
public void sendOtp(String principal) {
- Principal emailOrMobilePhone = PrincipalUtil.getEmailOrMobilePhone(principal);
- if (emailOrMobilePhone instanceof Email) {
- mailAndSmsVerifyService.sendOtpToEmail((Email) emailOrMobilePhone);
+ PrincipalType principalType = PrincipalUtil.getPrincipalType(principal);
+ if (principalType == PrincipalType.EMAIL) {
+ mailAndSmsVerifyService.sendOtpToEmail(Email.of(principal));
} else {
- mailAndSmsVerifyService.sendOtpToMobilePhone((MobilePhone) emailOrMobilePhone);
+ mailAndSmsVerifyService.sendOtpToMobilePhone(MobilePhone.of(principal));
}
}
}
diff --git a/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/service/AdminLogoutService.java b/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/service/AdminLogoutService.java
deleted file mode 100644
index dd83505..0000000
--- a/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/service/AdminLogoutService.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package xyz.zhouxy.plusone.system.application.service;
-
-import static xyz.zhouxy.plusone.system.constant.AuthLogic.adminAuthLogic;
-
-import org.springframework.stereotype.Service;
-
-/**
- * Admin 账号登出
- *
- * @author ZhouXY
- */
-@Service
-public class AdminLogoutService {
-
- public void execute() {
- adminAuthLogic.checkLogin();
- adminAuthLogic.logout();
- }
-}
diff --git a/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/service/MailAndSmsVerifyService.java b/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/service/MailAndSmsVerifyService.java
index 0439fcb..03611e5 100644
--- a/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/service/MailAndSmsVerifyService.java
+++ b/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/service/MailAndSmsVerifyService.java
@@ -107,7 +107,7 @@ public class MailAndSmsVerifyService {
}
private static String generateCode() {
- return RandomUtil.randomString(CODE_LENGTH);
+ return RandomUtil.randomString(RandomUtil.BASE_NUMBER, CODE_LENGTH);
}
}
diff --git a/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/service/RegisterAccountService.java b/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/service/RegisterAccountService.java
index 370a15f..e05c4b8 100644
--- a/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/service/RegisterAccountService.java
+++ b/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/service/RegisterAccountService.java
@@ -5,7 +5,6 @@ import java.util.Set;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-import xyz.zhouxy.plusone.exception.InvalidInputException;
import xyz.zhouxy.plusone.system.application.common.util.PrincipalType;
import xyz.zhouxy.plusone.system.application.common.util.PrincipalUtil;
import xyz.zhouxy.plusone.system.application.exception.AccountRegisterException;
@@ -18,6 +17,7 @@ import xyz.zhouxy.plusone.system.domain.model.account.Email;
import xyz.zhouxy.plusone.system.domain.model.account.MobilePhone;
import xyz.zhouxy.plusone.system.domain.model.account.Password;
import xyz.zhouxy.plusone.system.domain.model.account.Username;
+import xyz.zhouxy.plusone.validator.InvalidInputException;
/**
* 注册账号服务
diff --git a/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/service/command/ChangePasswordByOtpCommand.java b/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/service/command/ChangePasswordByOtpCommand.java
new file mode 100644
index 0000000..8cf3bff
--- /dev/null
+++ b/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/service/command/ChangePasswordByOtpCommand.java
@@ -0,0 +1,11 @@
+package xyz.zhouxy.plusone.system.application.service.command;
+
+import lombok.Data;
+import xyz.zhouxy.plusone.system.application.common.util.PrincipalType;
+
+@Data
+public class ChangePasswordByOtpCommand {
+ String account;
+ String otp;
+ PrincipalType principalType;
+}
diff --git a/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/service/command/ChangePasswordCommand.java b/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/service/command/ChangePasswordCommand.java
new file mode 100644
index 0000000..5b33d97
--- /dev/null
+++ b/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/service/command/ChangePasswordCommand.java
@@ -0,0 +1,11 @@
+package xyz.zhouxy.plusone.system.application.service.command;
+
+import lombok.Data;
+import xyz.zhouxy.plusone.domain.ICommand;
+
+@Data
+public class ChangePasswordCommand implements ICommand {
+ private String password;
+ private String newPassword;
+ private String passwordConfirmation;
+}
diff --git a/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/service/command/ChangePasswordWithoutLoginCommand.java b/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/service/command/ChangePasswordWithoutLoginCommand.java
new file mode 100644
index 0000000..d821819
--- /dev/null
+++ b/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/service/command/ChangePasswordWithoutLoginCommand.java
@@ -0,0 +1,12 @@
+package xyz.zhouxy.plusone.system.application.service.command;
+
+import lombok.Data;
+import xyz.zhouxy.plusone.domain.ICommand;
+
+@Data
+public class ChangePasswordWithoutLoginCommand implements ICommand {
+ private String account;
+ private String oldPassword;
+ private String newPassword;
+ private String passwordConfirmation;
+}
diff --git a/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/service/command/LoginByOtpCommand.java b/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/service/command/LoginByOtpCommand.java
index 2bf1efc..4e43c83 100644
--- a/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/service/command/LoginByOtpCommand.java
+++ b/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/service/command/LoginByOtpCommand.java
@@ -2,6 +2,7 @@ package xyz.zhouxy.plusone.system.application.service.command;
import lombok.Data;
import xyz.zhouxy.plusone.domain.ICommand;
+import xyz.zhouxy.plusone.system.application.common.util.PrincipalType;
/**
* 登录命令
@@ -14,6 +15,7 @@ public class LoginByOtpCommand implements ICommand {
String principal; // 邮箱地址 / 手机号
String otp; // 密码
boolean rememberMe; // 记住我
+ PrincipalType principalType;
// 进入登陆界面时或刷新验证码时,前端发送图形验证码的请求,后端生成 captcha 并暂存到 redis 中,key 为 UUID,将图形和 uuid 响应给前端。
// String uuid; // 校验码的 key
diff --git a/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/service/command/LoginByPasswordCommand.java b/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/service/command/LoginByPasswordCommand.java
index 518260a..47c6bd5 100644
--- a/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/service/command/LoginByPasswordCommand.java
+++ b/plusone-system/plusone-system-application/src/main/java/xyz/zhouxy/plusone/system/application/service/command/LoginByPasswordCommand.java
@@ -2,6 +2,7 @@ package xyz.zhouxy.plusone.system.application.service.command;
import lombok.Data;
import xyz.zhouxy.plusone.domain.ICommand;
+import xyz.zhouxy.plusone.system.application.common.util.PrincipalType;
/**
* 登录命令
@@ -14,6 +15,7 @@ public class LoginByPasswordCommand implements ICommand {
String principal; // 用户名 / 邮箱地址 / 手机号
String password; // 密码
boolean rememberMe; // 记住我
+ PrincipalType principalType;
// 进入登陆界面时或刷新验证码时,前端发送图形验证码的请求,后端生成 captcha 并暂存到 redis 中,key 为 UUID,将图形和 uuid 响应给前端。
// String uuid; // 校验码的 key
diff --git a/plusone-system/plusone-system-common/src/main/java/xyz/zhouxy/plusone/system/util/PasswordUtil.java b/plusone-system/plusone-system-common/src/main/java/xyz/zhouxy/plusone/system/util/PasswordUtil.java
index c0ac1bb..38d95b8 100644
--- a/plusone-system/plusone-system-common/src/main/java/xyz/zhouxy/plusone/system/util/PasswordUtil.java
+++ b/plusone-system/plusone-system-common/src/main/java/xyz/zhouxy/plusone/system/util/PasswordUtil.java
@@ -4,6 +4,7 @@ import javax.annotation.Nonnull;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.crypto.digest.DigestUtil;
+import xyz.zhouxy.plusone.constant.ErrorCodeConsts;
import xyz.zhouxy.plusone.exception.PlusoneException;
/**
@@ -30,7 +31,7 @@ public final class PasswordUtil {
+ salt.substring(1);
String sha512Hex = DigestUtil.sha512Hex(passwordWithSalt);
if (sha512Hex == null) {
- throw new PlusoneException(9999999, "未知错误:哈希加密失败!");
+ throw new PlusoneException(ErrorCodeConsts.DEFAULT_ERROR_CODE, "未知错误:哈希加密失败!");
}
return sha512Hex;
}
diff --git a/plusone-system/plusone-system-domain/src/main/java/xyz/zhouxy/plusone/system/domain/model/account/Account.java b/plusone-system/plusone-system-domain/src/main/java/xyz/zhouxy/plusone/system/domain/model/account/Account.java
index e19ab3a..2946951 100644
--- a/plusone-system/plusone-system-domain/src/main/java/xyz/zhouxy/plusone/system/domain/model/account/Account.java
+++ b/plusone-system/plusone-system-domain/src/main/java/xyz/zhouxy/plusone/system/domain/model/account/Account.java
@@ -5,8 +5,6 @@ import java.util.HashSet;
import java.util.Optional;
import java.util.Set;
-import javax.annotation.Nonnull;
-
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@@ -115,7 +113,7 @@ public class Account extends AggregateRoot implements IWithVersion {
addDomainEvent(new AccountRolesBound(this));
}
- public boolean checkPassword(@Nonnull String password) {
+ public boolean checkPassword(String password) {
return this.password.check(password);
}
diff --git a/plusone-system/plusone-system-domain/src/main/java/xyz/zhouxy/plusone/system/domain/model/account/Password.java b/plusone-system/plusone-system-domain/src/main/java/xyz/zhouxy/plusone/system/domain/model/account/Password.java
index 5388195..596e5a7 100644
--- a/plusone-system/plusone-system-domain/src/main/java/xyz/zhouxy/plusone/system/domain/model/account/Password.java
+++ b/plusone-system/plusone-system-domain/src/main/java/xyz/zhouxy/plusone/system/domain/model/account/Password.java
@@ -7,6 +7,7 @@ import javax.annotation.Nonnull;
import org.springframework.util.Assert;
+import xyz.zhouxy.plusone.constant.ErrorCodeConsts;
import xyz.zhouxy.plusone.constant.RegexConsts;
import xyz.zhouxy.plusone.domain.IValueObject;
import xyz.zhouxy.plusone.exception.PlusoneException;
@@ -36,7 +37,7 @@ public class Password implements IValueObject {
}
var salt = PasswordUtil.generateRandomSalt();
if (salt == null) {
- throw new PlusoneException(9999999, "未知错误:生成随机盐失败");
+ throw new PlusoneException(ErrorCodeConsts.DEFAULT_ERROR_CODE, "未知错误:生成随机盐失败");
}
this.saltVal = salt;
this.passwordVal = PasswordUtil.hashPassword(password, salt);