Compare commits
41 Commits
cf068566a1
...
feature/me
Author | SHA1 | Date | |
---|---|---|---|
16b1cb62d3 | |||
e9fe187c43 | |||
6ba7d9b906 | |||
e4b06d8b2d | |||
fcdf69026f | |||
4e4debaec9 | |||
0e0d6f1808 | |||
0dc78a2b89 | |||
7ef0776296 | |||
b2bc6b3a6f | |||
b6301d2dc9 | |||
e59dc804ab | |||
06ffc8d858 | |||
60b4f18e8c | |||
2b282039ad | |||
67313938e1 | |||
27be582bfb | |||
288ce9689f | |||
71edaa60a4 | |||
39cd57e675 | |||
7a44c43402 | |||
55395ed327 | |||
956da350ed | |||
78cdded667 | |||
cc3c4be8de | |||
1e31e1f327 | |||
993ba7fa7b | |||
8ae0faa04d | |||
920971c640 | |||
5f1cb36235 | |||
b4bccfe663 | |||
dc09022919 | |||
f0b6014e77 | |||
19557734ed | |||
ff54aca271 | |||
5d9e6ae5b3 | |||
5c3b31bb18 | |||
a0b16afde2 | |||
9293ba6817 | |||
92dbc613d2 | |||
5b80f70373 |
@@ -33,4 +33,4 @@ indent_size=4
|
|||||||
indent_size=2
|
indent_size=2
|
||||||
|
|
||||||
[*.java]
|
[*.java]
|
||||||
indent_size = 4
|
indent_size=4
|
||||||
|
@@ -11,7 +11,7 @@ import org.springframework.web.bind.annotation.ExceptionHandler;
|
|||||||
import org.springframework.web.bind.annotation.RestControllerAdvice;
|
import org.springframework.web.bind.annotation.RestControllerAdvice;
|
||||||
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import xyz.zhouxy.plusone.util.RestfulResult;
|
import xyz.zhouxy.plusone.commons.util.RestfulResult;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 默认异常的处理器
|
* 默认异常的处理器
|
||||||
|
@@ -0,0 +1,28 @@
|
|||||||
|
package xyz.zhouxy.plusone.exception.handler;
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
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.commons.util.RestfulResult;
|
||||||
|
import xyz.zhouxy.plusone.exception.SysException;
|
||||||
|
|
||||||
|
@RestControllerAdvice
|
||||||
|
@Slf4j
|
||||||
|
public class SysExceptionHandler extends BaseExceptionHandler {
|
||||||
|
|
||||||
|
public SysExceptionHandler(ExceptionInfoHolder exceptionInfoHolder) {
|
||||||
|
super(exceptionInfoHolder);
|
||||||
|
}
|
||||||
|
|
||||||
|
@ExceptionHandler({ SysException.class })
|
||||||
|
public ResponseEntity<RestfulResult> handleException(@Nonnull Exception e) {
|
||||||
|
log.error(e.getMessage(), e);
|
||||||
|
HttpStatus httpStatus = getHttpStatus(e);
|
||||||
|
return new ResponseEntity<>(RestfulResult.error(getErrorCode(e), "系统错误"), httpStatus);
|
||||||
|
}
|
||||||
|
}
|
@@ -39,17 +39,17 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>xyz.zhouxy.plusone</groupId>
|
<groupId>xyz.zhouxy.plusone</groupId>
|
||||||
<artifactId>plusone-commons</artifactId>
|
<artifactId>plusone-commons</artifactId>
|
||||||
<version>0.0.1-SNAPSHOT</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>xyz.zhouxy.plusone</groupId>
|
|
||||||
<artifactId>plusone-validator</artifactId>
|
|
||||||
<version>0.1.0-SNAPSHOT</version>
|
<version>0.1.0-SNAPSHOT</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>xyz.zhouxy.plusone</groupId>
|
||||||
|
<artifactId>plusone-validator</artifactId>
|
||||||
|
<version>0.1.3-SNAPSHOT</version>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>xyz.zhouxy.plusone</groupId>
|
<groupId>xyz.zhouxy.plusone</groupId>
|
||||||
<artifactId>plusone-exception-handler</artifactId>
|
<artifactId>plusone-exception-handler</artifactId>
|
||||||
<version>0.0.6-SNAPSHOT</version>
|
<version>0.0.8-SNAPSHOT</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
|
@@ -2,4 +2,8 @@ package xyz.zhouxy.plusone.constant;
|
|||||||
|
|
||||||
public class ErrorCodeConsts {
|
public class ErrorCodeConsts {
|
||||||
public static final int DEFAULT_ERROR_CODE = 9999999;
|
public static final int DEFAULT_ERROR_CODE = 9999999;
|
||||||
|
|
||||||
|
private ErrorCodeConsts() {
|
||||||
|
throw new IllegalStateException("Utility class");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -0,0 +1,39 @@
|
|||||||
|
package xyz.zhouxy.plusone.exception;
|
||||||
|
|
||||||
|
import xyz.zhouxy.plusone.commons.exception.BaseException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 业务异常
|
||||||
|
*
|
||||||
|
* @author <a href="https://gitee.com/zhouxy108">ZhouXY</a>
|
||||||
|
*/
|
||||||
|
public class BizException extends BaseException {
|
||||||
|
@java.io.Serial
|
||||||
|
private static final long serialVersionUID = -5524759033245815405L;
|
||||||
|
|
||||||
|
public static final int DEFAULT_ERROR_CODE = 4000000;
|
||||||
|
|
||||||
|
public BizException(int code, String msg) {
|
||||||
|
super(code, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
public BizException(int code, Throwable cause) {
|
||||||
|
super(code, cause);
|
||||||
|
}
|
||||||
|
|
||||||
|
public BizException(int code, String msg, Throwable cause) {
|
||||||
|
super(code, msg, cause);
|
||||||
|
}
|
||||||
|
|
||||||
|
public BizException(String msg) {
|
||||||
|
super(DEFAULT_ERROR_CODE, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
public BizException(Throwable cause) {
|
||||||
|
super(DEFAULT_ERROR_CODE, cause);
|
||||||
|
}
|
||||||
|
|
||||||
|
public BizException(String msg, Throwable cause) {
|
||||||
|
super(DEFAULT_ERROR_CODE, msg, cause);
|
||||||
|
}
|
||||||
|
}
|
@@ -9,7 +9,7 @@ import org.springframework.web.bind.annotation.ResponseStatus;
|
|||||||
* @author <a href="https://gitee.com/zhouxy108">ZhouXY</a>
|
* @author <a href="https://gitee.com/zhouxy108">ZhouXY</a>
|
||||||
*/
|
*/
|
||||||
@ResponseStatus(HttpStatus.NOT_FOUND)
|
@ResponseStatus(HttpStatus.NOT_FOUND)
|
||||||
public class DataNotExistException extends PlusoneException {
|
public class DataNotExistException extends BizException {
|
||||||
|
|
||||||
@java.io.Serial
|
@java.io.Serial
|
||||||
private static final long serialVersionUID = 6536955800679703111L;
|
private static final long serialVersionUID = 6536955800679703111L;
|
||||||
|
@@ -8,13 +8,12 @@ import org.springframework.web.bind.annotation.ResponseStatus;
|
|||||||
*
|
*
|
||||||
* <p>
|
* <p>
|
||||||
* 暂时先这样,后续完善异常体系时可能会更改。
|
* 暂时先这样,后续完善异常体系时可能会更改。
|
||||||
* </p>
|
|
||||||
*
|
*
|
||||||
* @author <a href="https://gitee.com/zhouxy108">ZhouXY</a>
|
* @author <a href="https://gitee.com/zhouxy108">ZhouXY</a>
|
||||||
* @see xyz.zhouxy.plusone.util.AssertResult
|
* @see xyz.zhouxy.plusone.util.AssertResult
|
||||||
*/
|
*/
|
||||||
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
|
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
|
||||||
public class DataOperationResultException extends PlusoneException {
|
public class DataOperationResultException extends SysException {
|
||||||
|
|
||||||
@java.io.Serial
|
@java.io.Serial
|
||||||
private static final long serialVersionUID = -9220765735990318186L;
|
private static final long serialVersionUID = -9220765735990318186L;
|
||||||
|
@@ -0,0 +1,34 @@
|
|||||||
|
package xyz.zhouxy.plusone.exception;
|
||||||
|
|
||||||
|
import xyz.zhouxy.plusone.commons.exception.BaseException;
|
||||||
|
|
||||||
|
public class SysException extends BaseException {
|
||||||
|
@java.io.Serial
|
||||||
|
private static final long serialVersionUID = 8821240827443168118L;
|
||||||
|
|
||||||
|
public static final int DEFAULT_ERROR_CODE = 5000000;
|
||||||
|
|
||||||
|
public SysException(int code, String msg) {
|
||||||
|
super(code, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
public SysException(int code, Throwable cause) {
|
||||||
|
super(code, cause);
|
||||||
|
}
|
||||||
|
|
||||||
|
public SysException(int code, String msg, Throwable cause) {
|
||||||
|
super(code, msg, cause);
|
||||||
|
}
|
||||||
|
|
||||||
|
public SysException(String msg) {
|
||||||
|
super(DEFAULT_ERROR_CODE, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
public SysException(Throwable cause) {
|
||||||
|
super(DEFAULT_ERROR_CODE, cause);
|
||||||
|
}
|
||||||
|
|
||||||
|
public SysException(String msg, Throwable cause) {
|
||||||
|
super(DEFAULT_ERROR_CODE, msg, cause);
|
||||||
|
}
|
||||||
|
}
|
@@ -9,7 +9,7 @@ import org.springframework.web.bind.annotation.ResponseStatus;
|
|||||||
* @author ZhouXY
|
* @author ZhouXY
|
||||||
*/
|
*/
|
||||||
@ResponseStatus(HttpStatus.BAD_REQUEST)
|
@ResponseStatus(HttpStatus.BAD_REQUEST)
|
||||||
public class UserOperationException extends PlusoneException {
|
public class UserOperationException extends BizException {
|
||||||
|
|
||||||
@java.io.Serial
|
@java.io.Serial
|
||||||
private static final long serialVersionUID = 4371055414421991940L;
|
private static final long serialVersionUID = 4371055414421991940L;
|
||||||
|
@@ -0,0 +1,18 @@
|
|||||||
|
package xyz.zhouxy.plusone.util;
|
||||||
|
|
||||||
|
import java.util.concurrent.ThreadLocalRandom;
|
||||||
|
|
||||||
|
public final class RandomUtil {
|
||||||
|
private RandomUtil() {
|
||||||
|
throw new IllegalStateException("Utility class");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String randomStr(char[] sourceCharacters, int length) {
|
||||||
|
ThreadLocalRandom random = ThreadLocalRandom.current();
|
||||||
|
char[] result = new char[length];
|
||||||
|
for (int i = 0; i < length; i++) {
|
||||||
|
result[i] = sourceCharacters[random.nextInt(sourceCharacters.length)];
|
||||||
|
}
|
||||||
|
return String.valueOf(result);
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,23 @@
|
|||||||
|
package xyz.zhouxy.plusone.util;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
class RandomUtilTests {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testRandom() {
|
||||||
|
String[] s = new String[20];
|
||||||
|
for (int i = 0; i < 20; i++) {
|
||||||
|
s[i] = RandomUtil.randomStr(
|
||||||
|
"0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM~`!@#$%^&*()_-+={[\\|/:;\"',.<>?]}"
|
||||||
|
.toCharArray(),
|
||||||
|
28);
|
||||||
|
}
|
||||||
|
log.info("{}", Arrays.toString(s));
|
||||||
|
}
|
||||||
|
}
|
@@ -15,11 +15,6 @@
|
|||||||
<groupId>xyz.zhouxy</groupId>
|
<groupId>xyz.zhouxy</groupId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>cn.hutool</groupId>
|
|
||||||
<artifactId>hutool-core</artifactId>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.projectlombok</groupId>
|
<groupId>org.projectlombok</groupId>
|
||||||
<artifactId>lombok</artifactId>
|
<artifactId>lombok</artifactId>
|
||||||
@@ -28,12 +23,10 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.fasterxml.jackson.core</groupId>
|
<groupId>com.fasterxml.jackson.core</groupId>
|
||||||
<artifactId>jackson-core</artifactId>
|
<artifactId>jackson-core</artifactId>
|
||||||
<version>2.13.4</version>
|
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.fasterxml.jackson.core</groupId>
|
<groupId>com.fasterxml.jackson.core</groupId>
|
||||||
<artifactId>jackson-annotations</artifactId>
|
<artifactId>jackson-annotations</artifactId>
|
||||||
<version>2.13.4</version>
|
</dependency>
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</project>
|
</project>
|
||||||
|
@@ -1,32 +1,36 @@
|
|||||||
package xyz.zhouxy.plusone.constant;
|
package xyz.zhouxy.plusone.constant;
|
||||||
|
|
||||||
import xyz.zhouxy.plusone.util.Enumeration;
|
import java.util.Collection;
|
||||||
import xyz.zhouxy.plusone.util.EnumerationValuesHolder;
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
|
||||||
|
import xyz.zhouxy.plusone.commons.util.Enumeration;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 实体状态
|
* 实体状态
|
||||||
*
|
*
|
||||||
* @author <a href="https://gitee.com/zhouxy108">ZhouXY</a>
|
* @author <a href="https://gitee.com/zhouxy108">ZhouXY</a>
|
||||||
*/
|
*/
|
||||||
public class EntityStatus extends Enumeration<EntityStatus> {
|
public final class EntityStatus extends Enumeration<EntityStatus> {
|
||||||
|
|
||||||
private EntityStatus(int value, String name) {
|
private EntityStatus(int id, @Nonnull String name) {
|
||||||
super(value, name);
|
super(id, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 常量
|
// 常量
|
||||||
public static final EntityStatus AVAILABLE = new EntityStatus(0, "正常");
|
public static final EntityStatus AVAILABLE = new EntityStatus(0, "正常");
|
||||||
public static final EntityStatus DISABLED = new EntityStatus(1, "禁用");
|
public static final EntityStatus DISABLED = new EntityStatus(1, "禁用");
|
||||||
|
|
||||||
private static final EnumerationValuesHolder<EntityStatus> ENUMERATION_VALUES = new EnumerationValuesHolder<>(
|
private static final ValueSet<EntityStatus> VALUE_SET = new ValueSet<>(
|
||||||
new EntityStatus[] { AVAILABLE, DISABLED });
|
AVAILABLE, DISABLED);
|
||||||
|
|
||||||
public static EntityStatus of(int value) {
|
@Nonnull
|
||||||
return ENUMERATION_VALUES.get(value);
|
public static EntityStatus of(int id) {
|
||||||
|
return VALUE_SET.get(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Nonnull
|
||||||
public String toString() {
|
public static Collection<EntityStatus> constants() {
|
||||||
return "EntityStatus" + super.toString();
|
return VALUE_SET.getValues();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,27 +0,0 @@
|
|||||||
package xyz.zhouxy.plusone.constant;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 正则表达式常量
|
|
||||||
*
|
|
||||||
* @author <a href="https://gitee.com/zhouxy108">ZhouXY</a>
|
|
||||||
*/
|
|
||||||
public final class RegexConsts {
|
|
||||||
|
|
||||||
public static final String DATE = "^\\d{4}-\\d{2}-\\d{2}";
|
|
||||||
|
|
||||||
public static final String PASSWORD = "^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])[\\w\\\\!#$%&'*\\+\\-/=?^`{|}~@\\(\\)\\[\\]\",\\.;':><]{8,32}$";
|
|
||||||
|
|
||||||
public static final String CAPTCHA = "^[0-9A-Za-z]{4,6}$";
|
|
||||||
|
|
||||||
public static final String EMAIL = "^\\w+([-+.]\\w+)*@[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})*(\\.(?![0-9]+$)[a-zA-Z0-9][-0-9A-Za-z]{0,62})$";
|
|
||||||
|
|
||||||
public static final String MOBILE_PHONE = "^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\\d{8}$";
|
|
||||||
|
|
||||||
public static final String USERNAME = "^[\\da-zA-Z_.@\\\\]{4,36}$";
|
|
||||||
|
|
||||||
public static final String NICKNAME = "^[\\da-zA-Z_.@\\\\]{4,36}$";
|
|
||||||
|
|
||||||
private RegexConsts() {
|
|
||||||
throw new IllegalStateException("Utility class");
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,6 +1,7 @@
|
|||||||
package xyz.zhouxy.plusone.domain;
|
package xyz.zhouxy.plusone.domain;
|
||||||
|
|
||||||
import cn.hutool.core.lang.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -20,7 +21,7 @@ public abstract class DomainEvent {
|
|||||||
private long happenedAt;
|
private long happenedAt;
|
||||||
|
|
||||||
protected DomainEvent() {
|
protected DomainEvent() {
|
||||||
this.identifier = UUID.randomUUID().toString(true);
|
this.identifier = UUID.randomUUID().toString();
|
||||||
this.happenedAt = System.currentTimeMillis();
|
this.happenedAt = System.currentTimeMillis();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
package xyz.zhouxy.plusone.domain;
|
package xyz.zhouxy.plusone.domain;
|
||||||
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||||
import com.fasterxml.jackson.annotation.JsonValue;
|
import com.fasterxml.jackson.annotation.JsonValue;
|
||||||
@@ -13,15 +14,15 @@ import com.fasterxml.jackson.annotation.JsonValue;
|
|||||||
public abstract class ValidatableStringRecord implements IValueObject {
|
public abstract class ValidatableStringRecord implements IValueObject {
|
||||||
|
|
||||||
protected String value;
|
protected String value;
|
||||||
protected final String format;
|
protected final Pattern format;
|
||||||
|
|
||||||
protected ValidatableStringRecord(String format) {
|
protected ValidatableStringRecord(Pattern format) {
|
||||||
this.format = format;
|
this.format = format;
|
||||||
}
|
}
|
||||||
|
|
||||||
@JsonIgnore
|
@JsonIgnore
|
||||||
protected boolean isValid() {
|
protected boolean isValid() {
|
||||||
return value.matches(format);
|
return format.matcher(value).matches();
|
||||||
}
|
}
|
||||||
|
|
||||||
@JsonValue
|
@JsonValue
|
||||||
@@ -35,6 +36,6 @@ public abstract class ValidatableStringRecord implements IValueObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static String getValueOrNull(Optional<? extends ValidatableStringRecord> s) {
|
public static String getValueOrNull(Optional<? extends ValidatableStringRecord> s) {
|
||||||
return s.map(ValidatableStringRecord::value).orElse(null);
|
return s.isPresent() ? s.get().value() : null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,36 +0,0 @@
|
|||||||
package xyz.zhouxy.plusone.util;
|
|
||||||
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
public class RegexUtil {
|
|
||||||
|
|
||||||
private RegexUtil() {
|
|
||||||
throw new IllegalStateException("Utility class");
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean matches(CharSequence input, String regex) {
|
|
||||||
return Pattern.matches(regex, input);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean matchesOr(CharSequence input, String... regexs) {
|
|
||||||
boolean isMatched;
|
|
||||||
for (var regex : regexs) {
|
|
||||||
isMatched = Pattern.matches(regex, input);
|
|
||||||
if (isMatched) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean matchesAnd(CharSequence input, String... regexs) {
|
|
||||||
boolean isMatched;
|
|
||||||
for (var regex : regexs) {
|
|
||||||
isMatched = Pattern.matches(regex, input);
|
|
||||||
if (!isMatched) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
@@ -14,9 +14,10 @@ import org.springframework.jdbc.core.RowMapper;
|
|||||||
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
|
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
|
||||||
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
|
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
|
||||||
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
|
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
|
||||||
|
import org.springframework.util.CollectionUtils;
|
||||||
|
|
||||||
|
import xyz.zhouxy.plusone.commons.util.NumberUtil;
|
||||||
import xyz.zhouxy.plusone.exception.DataOperationResultException;
|
import xyz.zhouxy.plusone.exception.DataOperationResultException;
|
||||||
import xyz.zhouxy.plusone.util.NumberUtil;
|
|
||||||
|
|
||||||
public abstract class PlusoneJdbcDaoSupport {
|
public abstract class PlusoneJdbcDaoSupport {
|
||||||
protected final NamedParameterJdbcTemplate jdbc;
|
protected final NamedParameterJdbcTemplate jdbc;
|
||||||
@@ -68,13 +69,13 @@ public abstract class PlusoneJdbcDaoSupport {
|
|||||||
return queryForStream(sql, new MapSqlParameterSource(paramName, value), elementType);
|
return queryForStream(sql, new MapSqlParameterSource(paramName, value), elementType);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected final boolean queryExists(String sql, SqlParameterSource parameterSource) {
|
protected final boolean queryForBool(String sql, SqlParameterSource parameterSource) {
|
||||||
Boolean isExists = this.jdbc.queryForObject(sql, parameterSource, Boolean.TYPE);
|
Boolean result = this.jdbc.queryForObject(sql, parameterSource, Boolean.TYPE);
|
||||||
return Boolean.TRUE.equals(isExists);
|
return Boolean.TRUE.equals(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected final boolean queryExists(String sql, String paramName, Object value) {
|
protected final boolean queryForBool(String sql, String paramName, Object value) {
|
||||||
return queryExists(sql, new MapSqlParameterSource(paramName, value));
|
return queryForBool(sql, new MapSqlParameterSource(paramName, value));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected final int update(String sql, SqlParameterSource parameterSource) {
|
protected final int update(String sql, SqlParameterSource parameterSource) {
|
||||||
@@ -85,18 +86,18 @@ public abstract class PlusoneJdbcDaoSupport {
|
|||||||
return update(sql, new MapSqlParameterSource(paramName, value));
|
return update(sql, new MapSqlParameterSource(paramName, value));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected final int batchUpdate(String sql, SqlParameterSource[] batchArgs) {
|
protected final long batchUpdate(String sql, SqlParameterSource[] batchArgs) {
|
||||||
int[] i = this.jdbc.batchUpdate(sql, batchArgs);
|
int[] i = this.jdbc.batchUpdate(sql, batchArgs);
|
||||||
return NumberUtil.sum(i);
|
return NumberUtil.sum(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected final <T> int batchUpdate(String sql, Stream<T> c,
|
protected final <T> long batchUpdate(String sql, Stream<T> c,
|
||||||
@Nonnull Function<T, SqlParameterSource> paramSourceBuilder) {
|
@Nonnull Function<T, SqlParameterSource> paramSourceBuilder) {
|
||||||
int[] i = this.jdbc.batchUpdate(sql, buildSqlParameterSourceArray(c, paramSourceBuilder));
|
int[] i = this.jdbc.batchUpdate(sql, buildSqlParameterSourceArray(c, paramSourceBuilder));
|
||||||
return NumberUtil.sum(i);
|
return NumberUtil.sum(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected final <T> int batchUpdate(String sql, Collection<T> c,
|
protected final <T> long batchUpdate(String sql, Collection<T> c,
|
||||||
@Nonnull Function<T, SqlParameterSource> paramSourceBuilder) {
|
@Nonnull Function<T, SqlParameterSource> paramSourceBuilder) {
|
||||||
int[] i = this.jdbc.batchUpdate(sql, buildSqlParameterSourceArray(c, paramSourceBuilder));
|
int[] i = this.jdbc.batchUpdate(sql, buildSqlParameterSourceArray(c, paramSourceBuilder));
|
||||||
return NumberUtil.sum(i);
|
return NumberUtil.sum(i);
|
||||||
@@ -156,7 +157,7 @@ public abstract class PlusoneJdbcDaoSupport {
|
|||||||
protected static final <T> SqlParameterSource[] buildSqlParameterSourceArray(
|
protected static final <T> SqlParameterSource[] buildSqlParameterSourceArray(
|
||||||
Collection<T> c,
|
Collection<T> c,
|
||||||
@Nonnull Function<T, SqlParameterSource> paramSourceBuilder) {
|
@Nonnull Function<T, SqlParameterSource> paramSourceBuilder) {
|
||||||
if (c == null || c.isEmpty()) {
|
if (CollectionUtils.isEmpty(c)) {
|
||||||
return new SqlParameterSource[] {};
|
return new SqlParameterSource[] {};
|
||||||
}
|
}
|
||||||
return buildSqlParameterSourceArray(c.stream(), paramSourceBuilder);
|
return buildSqlParameterSourceArray(c.stream(), paramSourceBuilder);
|
||||||
|
@@ -6,6 +6,7 @@ package xyz.zhouxy.plusone.oss;
|
|||||||
* @author <a href="https://gitee.com/zhouxy108">ZhouXY</a>
|
* @author <a href="https://gitee.com/zhouxy108">ZhouXY</a>
|
||||||
*/
|
*/
|
||||||
public class FastDFSException extends Exception {
|
public class FastDFSException extends Exception {
|
||||||
|
private static final long serialVersionUID = 7871031982887742468L;
|
||||||
|
|
||||||
public FastDFSException() {
|
public FastDFSException() {
|
||||||
}
|
}
|
||||||
|
@@ -1,5 +1,7 @@
|
|||||||
package xyz.zhouxy.plusone.sms;
|
package xyz.zhouxy.plusone.sms;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import com.tencentcloudapi.common.Credential;
|
import com.tencentcloudapi.common.Credential;
|
||||||
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
|
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
|
||||||
import com.tencentcloudapi.common.profile.ClientProfile;
|
import com.tencentcloudapi.common.profile.ClientProfile;
|
||||||
@@ -8,11 +10,8 @@ import com.tencentcloudapi.sms.v20210111.SmsClient;
|
|||||||
import com.tencentcloudapi.sms.v20210111.models.SendSmsRequest;
|
import com.tencentcloudapi.sms.v20210111.models.SendSmsRequest;
|
||||||
import com.tencentcloudapi.sms.v20210111.models.SendSmsResponse;
|
import com.tencentcloudapi.sms.v20210111.models.SendSmsResponse;
|
||||||
|
|
||||||
import org.springframework.stereotype.Service;
|
|
||||||
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import xyz.zhouxy.plusone.constant.ErrorCodeConsts;
|
import xyz.zhouxy.plusone.exception.SysException;
|
||||||
import xyz.zhouxy.plusone.exception.PlusoneException;
|
|
||||||
import xyz.zhouxy.plusone.sms.SmsProperties.SmsCredentialProperties;
|
import xyz.zhouxy.plusone.sms.SmsProperties.SmsCredentialProperties;
|
||||||
import xyz.zhouxy.plusone.sms.SmsProperties.SmsHttpProperties;
|
import xyz.zhouxy.plusone.sms.SmsProperties.SmsHttpProperties;
|
||||||
import xyz.zhouxy.plusone.sms.SmsProperties.SmsProxyProperties;
|
import xyz.zhouxy.plusone.sms.SmsProperties.SmsProxyProperties;
|
||||||
@@ -62,14 +61,13 @@ public class TencentSmsServiceImpl implements SmsService {
|
|||||||
var res = client.SendSms(req);
|
var res = client.SendSms(req);
|
||||||
|
|
||||||
// 输出json格式的字符串回包
|
// 输出json格式的字符串回包
|
||||||
System.out.println(SendSmsResponse.toJsonString(res));
|
log.info(SendSmsResponse.toJsonString(res));
|
||||||
|
|
||||||
// 也可以取出单个值,你可以通过官网接口文档或跳转到response对象的定义处查看返回字段的定义
|
// 也可以取出单个值,你可以通过官网接口文档或跳转到response对象的定义处查看返回字段的定义
|
||||||
// System.out.println(res.getRequestId());
|
// System.out.println(res.getRequestId());
|
||||||
|
|
||||||
} catch (TencentCloudSDKException e) {
|
} catch (TencentCloudSDKException e) {
|
||||||
log.error(e.getMessage(), e);
|
throw new SysException(e);
|
||||||
throw new PlusoneException(ErrorCodeConsts.DEFAULT_ERROR_CODE, e);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,11 +1,13 @@
|
|||||||
package xyz.zhouxy.plusone.validatortest;
|
package xyz.zhouxy.plusone.validatortest;
|
||||||
|
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
import xyz.zhouxy.plusone.constant.RegexConsts;
|
import xyz.zhouxy.plusone.commons.constant.PatternConsts;
|
||||||
import xyz.zhouxy.plusone.validator.BaseValidator;
|
import xyz.zhouxy.plusone.validator.BaseValidator;
|
||||||
|
|
||||||
class BaseValidatorTest {
|
class BaseValidatorTest {
|
||||||
@@ -34,11 +36,11 @@ class LoginCommandValidator extends BaseValidator<LoginCommand> {
|
|||||||
private LoginCommandValidator() {
|
private LoginCommandValidator() {
|
||||||
ruleForString(LoginCommand::getAccount)
|
ruleForString(LoginCommand::getAccount)
|
||||||
.notNull("邮箱地址不能为空")
|
.notNull("邮箱地址不能为空")
|
||||||
.matchesOr(new String[] { RegexConsts.EMAIL, RegexConsts.MOBILE_PHONE },
|
.matchesOr(new Pattern[] { PatternConsts.EMAIL, PatternConsts.MOBILE_PHONE },
|
||||||
value -> new RuntimeException('"' + value + "\" 不是邮箱地址或手机号"));
|
value -> new RuntimeException('"' + value + "\" 不是邮箱地址或手机号"));
|
||||||
ruleForString(LoginCommand::getPwd)
|
ruleForString(LoginCommand::getPwd)
|
||||||
.notNull("密码不能为空")
|
.notNull("密码不能为空")
|
||||||
.notEmpty("密码不能为空")
|
.notEmpty("密码不能为空")
|
||||||
.matches(RegexConsts.PASSWORD, "密码格式错误");
|
.matches(PatternConsts.PASSWORD, "密码格式错误");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -7,9 +7,7 @@
|
|||||||
<version>1.0.0-SNAPSHOT</version>
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<groupId>xyz.zhouxy</groupId>
|
|
||||||
<artifactId>plusone-basic</artifactId>
|
<artifactId>plusone-basic</artifactId>
|
||||||
<version>1.0.0-SNAPSHOT</version>
|
|
||||||
|
|
||||||
<packaging>pom</packaging>
|
<packaging>pom</packaging>
|
||||||
|
|
||||||
|
@@ -7,10 +7,7 @@
|
|||||||
<version>1.0.0-SNAPSHOT</version>
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<groupId>xyz.zhouxy</groupId>
|
|
||||||
<artifactId>plusone-start</artifactId>
|
<artifactId>plusone-start</artifactId>
|
||||||
<version>1.0.0-SNAPSHOT</version>
|
|
||||||
|
|
||||||
<name>plusone-start</name>
|
<name>plusone-start</name>
|
||||||
|
|
||||||
<description>参考 DDD 落地的脚手架</description>
|
<description>参考 DDD 落地的脚手架</description>
|
||||||
|
@@ -5,14 +5,14 @@ import java.io.ObjectStreamClass;
|
|||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import xyz.zhouxy.plusone.exception.PlusoneException;
|
import xyz.zhouxy.plusone.exception.*;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
class SerialTests {
|
class SerialTests {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void testSerialVersionUID() {
|
void testSerialVersionUID() {
|
||||||
var cl = PlusoneException.class;
|
var cl = SysException.class;
|
||||||
var c = ObjectStreamClass.lookup(cl);
|
var c = ObjectStreamClass.lookup(cl);
|
||||||
var uid = c.getSerialVersionUID();
|
var uid = c.getSerialVersionUID();
|
||||||
log.info("\n @java.io.Serial" +
|
log.info("\n @java.io.Serial" +
|
||||||
|
@@ -1,5 +1,7 @@
|
|||||||
package xyz.zhouxy.plusone;
|
package xyz.zhouxy.plusone;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
|
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
@@ -25,6 +27,7 @@ class TestAop {
|
|||||||
command.setPrincipal("Code108");
|
command.setPrincipal("Code108");
|
||||||
command.setPassword("2333");
|
command.setPassword("2333");
|
||||||
command.setRememberMe(false);
|
command.setRememberMe(false);
|
||||||
|
assertNotNull(service);
|
||||||
LoginInfoViewObject loginInfo = service.loginByPassword(command);
|
LoginInfoViewObject loginInfo = service.loginByPassword(command);
|
||||||
System.err.println(loginInfo);
|
System.err.println(loginInfo);
|
||||||
}
|
}
|
||||||
|
@@ -0,0 +1,32 @@
|
|||||||
|
package xyz.zhouxy.plusone.system.application.common.exception;
|
||||||
|
|
||||||
|
import xyz.zhouxy.plusone.exception.BizException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 不支持的 Principal 类型出现时抛出的异常
|
||||||
|
*
|
||||||
|
* @author <a href="https://zhouxy.xyz:3000/ZhouXY108">ZhouXY</a>
|
||||||
|
*/
|
||||||
|
public class UnsupportedPrincipalTypeException extends BizException {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 5207757290868470762L;
|
||||||
|
|
||||||
|
public static final int ERR_CODE = 4040201;
|
||||||
|
private static final String DEFAULT_ERROR_MSG = "不支持的 PrincipalType";
|
||||||
|
|
||||||
|
public UnsupportedPrincipalTypeException() {
|
||||||
|
super(ERR_CODE, DEFAULT_ERROR_MSG);
|
||||||
|
}
|
||||||
|
|
||||||
|
public UnsupportedPrincipalTypeException(String msg) {
|
||||||
|
super(ERR_CODE, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
public UnsupportedPrincipalTypeException(Throwable cause) {
|
||||||
|
super(ERR_CODE, cause);
|
||||||
|
}
|
||||||
|
|
||||||
|
public UnsupportedPrincipalTypeException(String msg, Throwable cause) {
|
||||||
|
super(ERR_CODE, msg, cause);
|
||||||
|
}
|
||||||
|
}
|
@@ -1,18 +1,20 @@
|
|||||||
package xyz.zhouxy.plusone.system.application.common.util;
|
package xyz.zhouxy.plusone.system.application.common.util;
|
||||||
|
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import xyz.zhouxy.plusone.constant.RegexConsts;
|
import xyz.zhouxy.plusone.commons.constant.PatternConsts;
|
||||||
|
|
||||||
public enum PrincipalType {
|
public enum PrincipalType {
|
||||||
EMAIL(RegexConsts.EMAIL),
|
EMAIL(PatternConsts.EMAIL),
|
||||||
MOBILE_PHONE(RegexConsts.MOBILE_PHONE),
|
MOBILE_PHONE(PatternConsts.MOBILE_PHONE),
|
||||||
USERNAME(RegexConsts.USERNAME)
|
USERNAME(PatternConsts.USERNAME)
|
||||||
;
|
;
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
private final String regex;
|
private final Pattern regex;
|
||||||
|
|
||||||
PrincipalType(String regex) {
|
PrincipalType(Pattern regex) {
|
||||||
this.regex = regex;
|
this.regex = regex;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -2,11 +2,11 @@ package xyz.zhouxy.plusone.system.application.common.util;
|
|||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
|
import xyz.zhouxy.plusone.system.application.common.exception.UnsupportedPrincipalTypeException;
|
||||||
import xyz.zhouxy.plusone.system.domain.model.account.Email;
|
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.MobilePhone;
|
||||||
import xyz.zhouxy.plusone.system.domain.model.account.Principal;
|
import xyz.zhouxy.plusone.system.domain.model.account.Principal;
|
||||||
import xyz.zhouxy.plusone.system.domain.model.account.Username;
|
import xyz.zhouxy.plusone.system.domain.model.account.Username;
|
||||||
import xyz.zhouxy.plusone.validator.InvalidInputException;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据字面值,判断并生成 {@link Principal} 值对象。
|
* 根据字面值,判断并生成 {@link Principal} 值对象。
|
||||||
@@ -16,7 +16,7 @@ import xyz.zhouxy.plusone.validator.InvalidInputException;
|
|||||||
* @see Username
|
* @see Username
|
||||||
* @see Email
|
* @see Email
|
||||||
* @see MobilePhone
|
* @see MobilePhone
|
||||||
* @see InvalidInputException
|
* @see UnsupportedPrincipalTypeException
|
||||||
*/
|
*/
|
||||||
public class PrincipalUtil {
|
public class PrincipalUtil {
|
||||||
|
|
||||||
@@ -30,11 +30,11 @@ public class PrincipalUtil {
|
|||||||
}
|
}
|
||||||
PrincipalType[] principalTypes = PrincipalType.values();
|
PrincipalType[] principalTypes = PrincipalType.values();
|
||||||
for (var principalType : principalTypes) {
|
for (var principalType : principalTypes) {
|
||||||
if (principal.matches(principalType.getRegex())) {
|
if (principalType.getRegex().matcher(principal).matches()) {
|
||||||
return principalType;
|
return principalType;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
throw InvalidInputException.unsupportedPrincipalTypeException();
|
throw new UnsupportedPrincipalTypeException();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Principal getPrincipal(@Nullable String principal) {
|
public static Principal getPrincipal(@Nullable String principal) {
|
||||||
@@ -48,7 +48,7 @@ public class PrincipalUtil {
|
|||||||
if (principalType == PrincipalType.USERNAME) {
|
if (principalType == PrincipalType.USERNAME) {
|
||||||
return Username.of(principal);
|
return Username.of(principal);
|
||||||
}
|
}
|
||||||
throw InvalidInputException.unsupportedPrincipalTypeException();
|
throw new UnsupportedPrincipalTypeException();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Principal getEmailOrMobilePhone(@Nullable String principal) {
|
public static Principal getEmailOrMobilePhone(@Nullable String principal) {
|
||||||
@@ -59,6 +59,6 @@ public class PrincipalUtil {
|
|||||||
if (principalType == PrincipalType.MOBILE_PHONE) {
|
if (principalType == PrincipalType.MOBILE_PHONE) {
|
||||||
return MobilePhone.of(principal);
|
return MobilePhone.of(principal);
|
||||||
}
|
}
|
||||||
throw InvalidInputException.unsupportedPrincipalTypeException("输入邮箱地址或手机号");
|
throw new UnsupportedPrincipalTypeException("输入邮箱地址或手机号");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -7,10 +7,10 @@ import org.springframework.web.bind.annotation.PostMapping;
|
|||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
import xyz.zhouxy.plusone.commons.util.RestfulResult;
|
||||||
import xyz.zhouxy.plusone.system.application.service.AccountContextService;
|
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.ChangePasswordCommand;
|
||||||
import xyz.zhouxy.plusone.system.application.service.command.ChangePasswordWithoutLoginCommand;
|
import xyz.zhouxy.plusone.system.application.service.command.ChangePasswordWithoutLoginCommand;
|
||||||
import xyz.zhouxy.plusone.util.RestfulResult;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 账号查询本身相关信息
|
* 账号查询本身相关信息
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
package xyz.zhouxy.plusone.system.application.controller;
|
package xyz.zhouxy.plusone.system.application.controller;
|
||||||
|
|
||||||
import static xyz.zhouxy.plusone.system.constant.AuthLogic.adminAuthLogic;
|
import static xyz.zhouxy.plusone.system.constant.AuthLogic.adminAuthLogic;
|
||||||
import static xyz.zhouxy.plusone.util.RestfulResult.success;
|
import static xyz.zhouxy.plusone.commons.util.RestfulResult.success;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -16,11 +16,11 @@ import org.springframework.web.bind.annotation.RequestBody;
|
|||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
import xyz.zhouxy.plusone.commons.util.RestfulResult;
|
||||||
import xyz.zhouxy.plusone.system.application.query.params.AccountQueryParams;
|
import xyz.zhouxy.plusone.system.application.query.params.AccountQueryParams;
|
||||||
import xyz.zhouxy.plusone.system.application.service.AccountManagementService;
|
import xyz.zhouxy.plusone.system.application.service.AccountManagementService;
|
||||||
import xyz.zhouxy.plusone.system.application.service.command.CreateAccountCommand;
|
import xyz.zhouxy.plusone.system.application.service.command.CreateAccountCommand;
|
||||||
import xyz.zhouxy.plusone.system.application.service.command.UpdateAccountCommand;
|
import xyz.zhouxy.plusone.system.application.service.command.UpdateAccountCommand;
|
||||||
import xyz.zhouxy.plusone.util.RestfulResult;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 账号管理
|
* 账号管理
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
package xyz.zhouxy.plusone.system.application.controller;
|
package xyz.zhouxy.plusone.system.application.controller;
|
||||||
|
|
||||||
import static xyz.zhouxy.plusone.util.RestfulResult.success;
|
import static xyz.zhouxy.plusone.commons.util.RestfulResult.success;
|
||||||
|
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
@@ -12,7 +12,7 @@ import org.springframework.web.bind.annotation.RestController;
|
|||||||
import xyz.zhouxy.plusone.system.application.service.AdminLoginService;
|
import xyz.zhouxy.plusone.system.application.service.AdminLoginService;
|
||||||
import xyz.zhouxy.plusone.system.application.service.command.LoginByOtpCommand;
|
import xyz.zhouxy.plusone.system.application.service.command.LoginByOtpCommand;
|
||||||
import xyz.zhouxy.plusone.system.application.service.command.LoginByPasswordCommand;
|
import xyz.zhouxy.plusone.system.application.service.command.LoginByPasswordCommand;
|
||||||
import xyz.zhouxy.plusone.util.RestfulResult;
|
import xyz.zhouxy.plusone.commons.util.RestfulResult;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Admin 账号登录
|
* Admin 账号登录
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
package xyz.zhouxy.plusone.system.application.controller;
|
package xyz.zhouxy.plusone.system.application.controller;
|
||||||
|
|
||||||
import static xyz.zhouxy.plusone.system.constant.AuthLogic.adminAuthLogic;
|
import static xyz.zhouxy.plusone.system.constant.AuthLogic.adminAuthLogic;
|
||||||
import static xyz.zhouxy.plusone.util.RestfulResult.success;
|
import static xyz.zhouxy.plusone.commons.util.RestfulResult.success;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -20,7 +20,7 @@ import xyz.zhouxy.plusone.system.application.query.params.DictQueryParams;
|
|||||||
import xyz.zhouxy.plusone.system.application.service.DictManagementService;
|
import xyz.zhouxy.plusone.system.application.service.DictManagementService;
|
||||||
import xyz.zhouxy.plusone.system.application.service.command.CreateDictCommand;
|
import xyz.zhouxy.plusone.system.application.service.command.CreateDictCommand;
|
||||||
import xyz.zhouxy.plusone.system.application.service.command.UpdateDictCommand;
|
import xyz.zhouxy.plusone.system.application.service.command.UpdateDictCommand;
|
||||||
import xyz.zhouxy.plusone.util.RestfulResult;
|
import xyz.zhouxy.plusone.commons.util.RestfulResult;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 数据字典管理
|
* 数据字典管理
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
package xyz.zhouxy.plusone.system.application.controller;
|
package xyz.zhouxy.plusone.system.application.controller;
|
||||||
|
|
||||||
import static xyz.zhouxy.plusone.system.constant.AuthLogic.adminAuthLogic;
|
import static xyz.zhouxy.plusone.system.constant.AuthLogic.adminAuthLogic;
|
||||||
import static xyz.zhouxy.plusone.util.RestfulResult.success;
|
import static xyz.zhouxy.plusone.commons.util.RestfulResult.success;
|
||||||
|
|
||||||
import javax.validation.Valid;
|
import javax.validation.Valid;
|
||||||
|
|
||||||
@@ -15,10 +15,11 @@ import org.springframework.web.bind.annotation.RequestMapping;
|
|||||||
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
import xyz.zhouxy.plusone.system.application.query.params.MenuQueryParams;
|
||||||
import xyz.zhouxy.plusone.system.application.service.MenuManagementService;
|
import xyz.zhouxy.plusone.system.application.service.MenuManagementService;
|
||||||
import xyz.zhouxy.plusone.system.application.service.command.CreateMenuCommand;
|
import xyz.zhouxy.plusone.system.application.service.command.CreateMenuCommand;
|
||||||
import xyz.zhouxy.plusone.system.application.service.command.UpdateMenuCommand;
|
import xyz.zhouxy.plusone.system.application.service.command.UpdateMenuCommand;
|
||||||
import xyz.zhouxy.plusone.util.RestfulResult;
|
import xyz.zhouxy.plusone.commons.util.RestfulResult;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 菜单管理
|
* 菜单管理
|
||||||
@@ -66,7 +67,14 @@ public class MenuManagementController {
|
|||||||
public RestfulResult findById(@PathVariable("id") Long id) {
|
public RestfulResult findById(@PathVariable("id") Long id) {
|
||||||
adminAuthLogic.checkPermission("sys-menu-details");
|
adminAuthLogic.checkPermission("sys-menu-details");
|
||||||
var result = service.findById(id);
|
var result = service.findById(id);
|
||||||
return RestfulResult.success("查询成功", result);
|
return success("查询成功", result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping
|
||||||
|
public RestfulResult queryMenuTree(MenuQueryParams queryParams) {
|
||||||
|
adminAuthLogic.checkPermission("sys-menu-query");
|
||||||
|
var result = service.queryMenuTree(queryParams);
|
||||||
|
return success("查询成功", result);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("queryByAccountId")
|
@GetMapping("queryByAccountId")
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
package xyz.zhouxy.plusone.system.application.controller;
|
package xyz.zhouxy.plusone.system.application.controller;
|
||||||
|
|
||||||
import static xyz.zhouxy.plusone.util.RestfulResult.success;
|
import static xyz.zhouxy.plusone.commons.util.RestfulResult.success;
|
||||||
|
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
@@ -11,7 +11,7 @@ import org.springframework.web.bind.annotation.RestController;
|
|||||||
|
|
||||||
import xyz.zhouxy.plusone.system.application.service.RegisterAccountService;
|
import xyz.zhouxy.plusone.system.application.service.RegisterAccountService;
|
||||||
import xyz.zhouxy.plusone.system.application.service.command.RegisterAccountCommand;
|
import xyz.zhouxy.plusone.system.application.service.command.RegisterAccountCommand;
|
||||||
import xyz.zhouxy.plusone.util.RestfulResult;
|
import xyz.zhouxy.plusone.commons.util.RestfulResult;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 注册账号服务
|
* 注册账号服务
|
||||||
|
@@ -17,7 +17,7 @@ import xyz.zhouxy.plusone.system.application.query.params.RoleQueryParams;
|
|||||||
import xyz.zhouxy.plusone.system.application.service.RoleManagementService;
|
import xyz.zhouxy.plusone.system.application.service.RoleManagementService;
|
||||||
import xyz.zhouxy.plusone.system.application.service.command.CreateRoleCommand;
|
import xyz.zhouxy.plusone.system.application.service.command.CreateRoleCommand;
|
||||||
import xyz.zhouxy.plusone.system.application.service.command.UpdateRoleCommand;
|
import xyz.zhouxy.plusone.system.application.service.command.UpdateRoleCommand;
|
||||||
import xyz.zhouxy.plusone.util.RestfulResult;
|
import xyz.zhouxy.plusone.commons.util.RestfulResult;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 角色管理服务
|
* 角色管理服务
|
||||||
|
@@ -3,10 +3,10 @@ package xyz.zhouxy.plusone.system.application.exception;
|
|||||||
import org.springframework.http.HttpStatus;
|
import org.springframework.http.HttpStatus;
|
||||||
import org.springframework.web.bind.annotation.ResponseStatus;
|
import org.springframework.web.bind.annotation.ResponseStatus;
|
||||||
|
|
||||||
import xyz.zhouxy.plusone.exception.PlusoneException;
|
import xyz.zhouxy.plusone.exception.BizException;
|
||||||
|
|
||||||
@ResponseStatus(HttpStatus.BAD_REQUEST)
|
@ResponseStatus(HttpStatus.BAD_REQUEST)
|
||||||
public class AccountLoginException extends PlusoneException {
|
public class AccountLoginException extends BizException {
|
||||||
@java.io.Serial
|
@java.io.Serial
|
||||||
private static final long serialVersionUID = -3040996790739138556L;
|
private static final long serialVersionUID = -3040996790739138556L;
|
||||||
|
|
||||||
|
@@ -3,10 +3,10 @@ package xyz.zhouxy.plusone.system.application.exception;
|
|||||||
import org.springframework.http.HttpStatus;
|
import org.springframework.http.HttpStatus;
|
||||||
import org.springframework.web.bind.annotation.ResponseStatus;
|
import org.springframework.web.bind.annotation.ResponseStatus;
|
||||||
|
|
||||||
import xyz.zhouxy.plusone.exception.PlusoneException;
|
import xyz.zhouxy.plusone.exception.BizException;
|
||||||
|
|
||||||
@ResponseStatus(HttpStatus.BAD_REQUEST)
|
@ResponseStatus(HttpStatus.BAD_REQUEST)
|
||||||
public class AccountRegisterException extends PlusoneException {
|
public class AccountRegisterException extends BizException {
|
||||||
|
|
||||||
@java.io.Serial
|
@java.io.Serial
|
||||||
private static final long serialVersionUID = 7580245181633370195L;
|
private static final long serialVersionUID = 7580245181633370195L;
|
||||||
|
@@ -8,7 +8,7 @@ import org.springframework.web.bind.annotation.RestControllerAdvice;
|
|||||||
|
|
||||||
import xyz.zhouxy.plusone.exception.handler.BaseExceptionHandler;
|
import xyz.zhouxy.plusone.exception.handler.BaseExceptionHandler;
|
||||||
import xyz.zhouxy.plusone.system.application.exception.AccountLoginException;
|
import xyz.zhouxy.plusone.system.application.exception.AccountLoginException;
|
||||||
import xyz.zhouxy.plusone.util.RestfulResult;
|
import xyz.zhouxy.plusone.commons.util.RestfulResult;
|
||||||
|
|
||||||
@RestControllerAdvice
|
@RestControllerAdvice
|
||||||
public class AccountLoginExceptionHandler extends BaseExceptionHandler {
|
public class AccountLoginExceptionHandler extends BaseExceptionHandler {
|
||||||
|
@@ -15,7 +15,7 @@ import cn.dev33.satoken.exception.SaTokenException;
|
|||||||
import cn.dev33.satoken.exception.SameTokenInvalidException;
|
import cn.dev33.satoken.exception.SameTokenInvalidException;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import xyz.zhouxy.plusone.exception.handler.BaseExceptionHandler;
|
import xyz.zhouxy.plusone.exception.handler.BaseExceptionHandler;
|
||||||
import xyz.zhouxy.plusone.util.RestfulResult;
|
import xyz.zhouxy.plusone.commons.util.RestfulResult;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sa-Token 异常处理器
|
* Sa-Token 异常处理器
|
||||||
|
@@ -4,10 +4,10 @@ import java.util.List;
|
|||||||
|
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
|
||||||
|
import xyz.zhouxy.plusone.commons.util.PageDTO;
|
||||||
import xyz.zhouxy.plusone.system.application.query.params.AccountQueryParams;
|
import xyz.zhouxy.plusone.system.application.query.params.AccountQueryParams;
|
||||||
import xyz.zhouxy.plusone.system.application.query.result.AccountDetails;
|
import xyz.zhouxy.plusone.system.application.query.result.AccountDetails;
|
||||||
import xyz.zhouxy.plusone.system.application.query.result.AccountOverview;
|
import xyz.zhouxy.plusone.system.application.query.result.AccountOverview;
|
||||||
import xyz.zhouxy.plusone.util.PageDTO;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 账号信息查询器
|
* 账号信息查询器
|
||||||
|
@@ -0,0 +1,23 @@
|
|||||||
|
package xyz.zhouxy.plusone.system.application.query;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import xyz.zhouxy.plusone.system.application.query.params.MenuQueryParams;
|
||||||
|
import xyz.zhouxy.plusone.system.application.query.result.MenuViewObject;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @author <a href="https://gitee.com/zhouxy108">ZhouXY</a>
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
public class MenuQueries {
|
||||||
|
|
||||||
|
public List<MenuViewObject> queryMenuTree(MenuQueryParams queryParams) {
|
||||||
|
// TODO【添加】 实现该查询
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -1,10 +0,0 @@
|
|||||||
package xyz.zhouxy.plusone.system.application.query;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @author <a href="https://gitee.com/zhouxy108">ZhouXY</a>
|
|
||||||
*/
|
|
||||||
public interface PermissionQueries {
|
|
||||||
// TODO【添加】 权限信息查询器
|
|
||||||
}
|
|
@@ -5,7 +5,7 @@ import java.time.LocalDate;
|
|||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
import lombok.ToString;
|
import lombok.ToString;
|
||||||
import xyz.zhouxy.plusone.util.PagingAndSortingQueryParams;
|
import xyz.zhouxy.plusone.commons.util.PagingAndSortingQueryParams;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 账号信息查询参数
|
* 账号信息查询参数
|
||||||
|
@@ -4,7 +4,7 @@ import lombok.Getter;
|
|||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
import lombok.ToString;
|
import lombok.ToString;
|
||||||
import lombok.experimental.Accessors;
|
import lombok.experimental.Accessors;
|
||||||
import xyz.zhouxy.plusone.util.PagingAndSortingQueryParams;
|
import xyz.zhouxy.plusone.commons.util.PagingAndSortingQueryParams;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 数据字典查询参数
|
* 数据字典查询参数
|
||||||
|
@@ -0,0 +1,18 @@
|
|||||||
|
package xyz.zhouxy.plusone.system.application.query.params;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
import lombok.ToString;
|
||||||
|
import xyz.zhouxy.plusone.constant.EntityStatus;
|
||||||
|
|
||||||
|
@ToString
|
||||||
|
public class MenuQueryParams {
|
||||||
|
private @Getter @Setter String name;
|
||||||
|
private @Getter @Setter String path;
|
||||||
|
private @Getter @Setter String title;
|
||||||
|
private @Getter @Setter Boolean hidden;
|
||||||
|
private @Getter @Setter EntityStatus status;
|
||||||
|
private @Getter @Setter String component;
|
||||||
|
private @Getter @Setter Boolean cache;
|
||||||
|
private @Getter @Setter String resource;
|
||||||
|
}
|
@@ -5,7 +5,7 @@ import java.time.LocalDate;
|
|||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
import lombok.ToString;
|
import lombok.ToString;
|
||||||
import xyz.zhouxy.plusone.util.PagingAndSortingQueryParams;
|
import xyz.zhouxy.plusone.commons.util.PagingAndSortingQueryParams;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 角色信息查询参数
|
* 角色信息查询参数
|
||||||
|
@@ -25,60 +25,28 @@ import xyz.zhouxy.plusone.system.domain.model.menu.Menu.MenuType;
|
|||||||
@JsonInclude(JsonInclude.Include.NON_NULL)
|
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||||
public class MenuViewObject implements IWithOrderNumber {
|
public class MenuViewObject implements IWithOrderNumber {
|
||||||
|
|
||||||
@Getter
|
private @Getter @Setter Integer type;
|
||||||
@Setter
|
|
||||||
Integer type;
|
|
||||||
|
|
||||||
@Getter
|
private @Getter @Setter String typeName;
|
||||||
@Setter
|
|
||||||
String typeName;
|
|
||||||
|
|
||||||
@Getter
|
private @Getter @Setter Long id;
|
||||||
@Setter
|
private @Getter @Setter Long parentId;
|
||||||
Long id;
|
|
||||||
@Getter
|
|
||||||
@Setter
|
|
||||||
Long parentId;
|
|
||||||
|
|
||||||
@Getter
|
private @Getter @Setter String name;
|
||||||
@Setter
|
|
||||||
String name;
|
|
||||||
// 若 type 为 MENU_ITEM 且 path 以 http:// 或 https:// 开头则被识别为外链
|
// 若 type 为 MENU_ITEM 且 path 以 http:// 或 https:// 开头则被识别为外链
|
||||||
@Getter
|
private @Getter @Setter String path;
|
||||||
@Setter
|
private @Getter @Setter String title;
|
||||||
String path;
|
private @Getter @Setter String icon;
|
||||||
@Getter
|
private @Getter @Setter boolean hidden;
|
||||||
@Setter
|
private @Getter @Setter int orderNumber;
|
||||||
String title;
|
private @Getter @Setter Integer status;
|
||||||
@Getter
|
private @Getter @Setter String remarks;
|
||||||
@Setter
|
|
||||||
String icon;
|
|
||||||
@Getter
|
|
||||||
@Setter
|
|
||||||
boolean hidden;
|
|
||||||
@Getter
|
|
||||||
@Setter
|
|
||||||
int orderNumber;
|
|
||||||
@Getter
|
|
||||||
@Setter
|
|
||||||
Integer status;
|
|
||||||
@Getter
|
|
||||||
@Setter
|
|
||||||
String remarks;
|
|
||||||
|
|
||||||
// MENU_ITEM
|
// MENU_ITEM
|
||||||
@Getter
|
private @Getter @Setter String component;
|
||||||
@Setter
|
private @Getter @Setter Boolean cache;
|
||||||
String component;
|
private @Getter @Setter String resource;
|
||||||
@Getter
|
private @Getter @Setter List<Action> actions;
|
||||||
@Setter
|
|
||||||
Boolean cache;
|
|
||||||
@Getter
|
|
||||||
@Setter
|
|
||||||
String resource;
|
|
||||||
@Getter
|
|
||||||
@Setter
|
|
||||||
List<Action> actions;
|
|
||||||
|
|
||||||
// MENU_LIST
|
// MENU_LIST
|
||||||
List<MenuViewObject> children;
|
List<MenuViewObject> children;
|
||||||
@@ -109,7 +77,7 @@ public class MenuViewObject implements IWithOrderNumber {
|
|||||||
viewObject.icon = menu.getIcon();
|
viewObject.icon = menu.getIcon();
|
||||||
viewObject.hidden = menu.isHidden();
|
viewObject.hidden = menu.isHidden();
|
||||||
viewObject.orderNumber = menu.getOrderNumber();
|
viewObject.orderNumber = menu.getOrderNumber();
|
||||||
viewObject.status = menu.getStatus().getValue();
|
viewObject.status = menu.getStatus().getId();
|
||||||
viewObject.remarks = menu.getRemarks();
|
viewObject.remarks = menu.getRemarks();
|
||||||
if (viewObject.type == MenuType.MENU_ITEM.ordinal()) {
|
if (viewObject.type == MenuType.MENU_ITEM.ordinal()) {
|
||||||
viewObject.component = menu.getComponent();
|
viewObject.component = menu.getComponent();
|
||||||
|
@@ -1,7 +1,6 @@
|
|||||||
package xyz.zhouxy.plusone.system.application.service;
|
package xyz.zhouxy.plusone.system.application.service;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
|
|
||||||
@@ -9,6 +8,7 @@ import org.springframework.stereotype.Service;
|
|||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
import cn.dev33.satoken.stp.StpLogic;
|
import cn.dev33.satoken.stp.StpLogic;
|
||||||
|
import xyz.zhouxy.plusone.system.application.common.exception.UnsupportedPrincipalTypeException;
|
||||||
import xyz.zhouxy.plusone.system.application.common.util.PrincipalUtil;
|
import xyz.zhouxy.plusone.system.application.common.util.PrincipalUtil;
|
||||||
import xyz.zhouxy.plusone.system.application.exception.AccountLoginException;
|
import xyz.zhouxy.plusone.system.application.exception.AccountLoginException;
|
||||||
import xyz.zhouxy.plusone.system.application.query.AccountQueries;
|
import xyz.zhouxy.plusone.system.application.query.AccountQueries;
|
||||||
@@ -23,7 +23,6 @@ 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.Email;
|
||||||
import xyz.zhouxy.plusone.system.domain.model.account.MobilePhone;
|
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.Principal;
|
||||||
import xyz.zhouxy.plusone.validator.InvalidInputException;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 账号对当前帐号进行操作
|
* 账号对当前帐号进行操作
|
||||||
@@ -91,13 +90,14 @@ public class AccountContextService {
|
|||||||
public void changePasswordByOtp(ChangePasswordByOtpCommand command) {
|
public void changePasswordByOtp(ChangePasswordByOtpCommand command) {
|
||||||
|
|
||||||
var principal = command.getAccount();
|
var principal = command.getAccount();
|
||||||
Optional<Account> account = switch (command.getPrincipalType()) {
|
boolean accountExists = switch (command.getPrincipalType()) {
|
||||||
case EMAIL -> accountRepository.findByEmail(Email.of(principal));
|
case EMAIL -> accountRepository.existsEmail(Email.of(principal));
|
||||||
case MOBILE_PHONE -> accountRepository.findByMobilePhone(MobilePhone.of(principal));
|
case MOBILE_PHONE -> accountRepository.existsMobilePhone(MobilePhone.of(principal));
|
||||||
default -> throw InvalidInputException.unsupportedPrincipalTypeException("输入邮箱地址或手机号");
|
default -> throw new UnsupportedPrincipalTypeException("输入邮箱地址或手机号");
|
||||||
};
|
};
|
||||||
account.orElseThrow(AccountLoginException::accountNotExistException);
|
if (accountExists) {
|
||||||
|
throw AccountLoginException.accountNotExistException();
|
||||||
|
}
|
||||||
mailAndSmsVerifyService.checkOtp(principal, command.getOtp());
|
mailAndSmsVerifyService.checkOtp(principal, command.getOtp());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -14,6 +14,7 @@ import org.springframework.util.Assert;
|
|||||||
import org.springframework.util.StringUtils;
|
import org.springframework.util.StringUtils;
|
||||||
import org.springframework.web.bind.annotation.PathVariable;
|
import org.springframework.web.bind.annotation.PathVariable;
|
||||||
|
|
||||||
|
import xyz.zhouxy.plusone.commons.util.PageDTO;
|
||||||
import xyz.zhouxy.plusone.exception.DataNotExistException;
|
import xyz.zhouxy.plusone.exception.DataNotExistException;
|
||||||
import xyz.zhouxy.plusone.system.application.exception.AccountRegisterException;
|
import xyz.zhouxy.plusone.system.application.exception.AccountRegisterException;
|
||||||
import xyz.zhouxy.plusone.system.application.query.AccountQueries;
|
import xyz.zhouxy.plusone.system.application.query.AccountQueries;
|
||||||
@@ -25,11 +26,12 @@ import xyz.zhouxy.plusone.system.application.service.command.UpdateAccountComman
|
|||||||
import xyz.zhouxy.plusone.system.domain.model.account.Account;
|
import xyz.zhouxy.plusone.system.domain.model.account.Account;
|
||||||
import xyz.zhouxy.plusone.system.domain.model.account.AccountInfo;
|
import xyz.zhouxy.plusone.system.domain.model.account.AccountInfo;
|
||||||
import xyz.zhouxy.plusone.system.domain.model.account.AccountRepository;
|
import xyz.zhouxy.plusone.system.domain.model.account.AccountRepository;
|
||||||
|
import xyz.zhouxy.plusone.system.domain.model.account.AccountStatus;
|
||||||
import xyz.zhouxy.plusone.system.domain.model.account.Email;
|
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.MobilePhone;
|
||||||
|
import xyz.zhouxy.plusone.system.domain.model.account.Sex;
|
||||||
import xyz.zhouxy.plusone.system.domain.model.account.Username;
|
import xyz.zhouxy.plusone.system.domain.model.account.Username;
|
||||||
import xyz.zhouxy.plusone.util.AssertResult;
|
import xyz.zhouxy.plusone.util.AssertResult;
|
||||||
import xyz.zhouxy.plusone.util.PageDTO;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 账号管理
|
* 账号管理
|
||||||
@@ -67,9 +69,13 @@ public class AccountManagementService {
|
|||||||
mobilePhone,
|
mobilePhone,
|
||||||
command.getPassword(),
|
command.getPassword(),
|
||||||
command.getPasswordConfirmation(),
|
command.getPasswordConfirmation(),
|
||||||
command.getStatus(),
|
AccountStatus.of(command.getStatus()),
|
||||||
command.getRoleRefs(),
|
command.getRoleRefs(),
|
||||||
AccountInfo.of(command.getNickname(), command.getAvatar(), command.getSex()),
|
AccountInfo.builder()
|
||||||
|
.nickname(command.getNickname())
|
||||||
|
.avatar(command.getAvatar())
|
||||||
|
.sex(Sex.of(command.getSex()))
|
||||||
|
.build(),
|
||||||
adminAuthLogic.getLoginIdAsLong());
|
adminAuthLogic.getLoginIdAsLong());
|
||||||
accountRepository.save(account);
|
accountRepository.save(account);
|
||||||
}
|
}
|
||||||
@@ -87,7 +93,7 @@ public class AccountManagementService {
|
|||||||
Assert.isTrue(Objects.equals(id, command.getId()), "参数错误: id 不匹配");
|
Assert.isTrue(Objects.equals(id, command.getId()), "参数错误: id 不匹配");
|
||||||
Account account = accountRepository.find(id)
|
Account account = accountRepository.find(id)
|
||||||
.orElseThrow(() -> new DataNotExistException("该账号不存在"));
|
.orElseThrow(() -> new DataNotExistException("该账号不存在"));
|
||||||
account.setAccountInfo(command.getNickname(), command.getAvatar(), command.getSex());
|
account.setAccountInfo(command.getNickname(), command.getAvatar(), Sex.of(command.getSex()));
|
||||||
account.setUpdatedBy(adminAuthLogic.getLoginIdAsLong());
|
account.setUpdatedBy(adminAuthLogic.getLoginIdAsLong());
|
||||||
accountRepository.save(account);
|
accountRepository.save(account);
|
||||||
}
|
}
|
||||||
|
@@ -6,6 +6,7 @@ import org.springframework.stereotype.Service;
|
|||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
import cn.hutool.core.lang.Assert;
|
import cn.hutool.core.lang.Assert;
|
||||||
|
import xyz.zhouxy.plusone.system.application.common.exception.UnsupportedPrincipalTypeException;
|
||||||
import xyz.zhouxy.plusone.system.application.common.util.PrincipalType;
|
import xyz.zhouxy.plusone.system.application.common.util.PrincipalType;
|
||||||
import xyz.zhouxy.plusone.system.application.common.util.PrincipalUtil;
|
import xyz.zhouxy.plusone.system.application.common.util.PrincipalUtil;
|
||||||
import xyz.zhouxy.plusone.system.application.exception.AccountLoginException;
|
import xyz.zhouxy.plusone.system.application.exception.AccountLoginException;
|
||||||
@@ -18,7 +19,6 @@ 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.Email;
|
||||||
import xyz.zhouxy.plusone.system.domain.model.account.MobilePhone;
|
import xyz.zhouxy.plusone.system.domain.model.account.MobilePhone;
|
||||||
import xyz.zhouxy.plusone.system.domain.model.account.Username;
|
import xyz.zhouxy.plusone.system.domain.model.account.Username;
|
||||||
import xyz.zhouxy.plusone.validator.InvalidInputException;
|
|
||||||
import xyz.zhouxy.plusone.validator.ValidateDto;
|
import xyz.zhouxy.plusone.validator.ValidateDto;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -63,7 +63,7 @@ public class AdminLoginService {
|
|||||||
Account account = (switch (command.getPrincipalType()) {
|
Account account = (switch (command.getPrincipalType()) {
|
||||||
case EMAIL -> accountRepository.findByEmail(Email.of(principal));
|
case EMAIL -> accountRepository.findByEmail(Email.of(principal));
|
||||||
case MOBILE_PHONE -> accountRepository.findByMobilePhone(MobilePhone.of(principal));
|
case MOBILE_PHONE -> accountRepository.findByMobilePhone(MobilePhone.of(principal));
|
||||||
default -> throw InvalidInputException.unsupportedPrincipalTypeException("输入邮箱地址或手机号");
|
default -> throw new UnsupportedPrincipalTypeException("输入邮箱地址或手机号");
|
||||||
}).orElseThrow(AccountLoginException::accountNotExistException);
|
}).orElseThrow(AccountLoginException::accountNotExistException);
|
||||||
|
|
||||||
mailAndSmsVerifyService.checkOtp(principal, command.getOtp());
|
mailAndSmsVerifyService.checkOtp(principal, command.getOtp());
|
||||||
|
@@ -13,9 +13,12 @@ import org.springframework.transaction.annotation.Propagation;
|
|||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
|
|
||||||
|
import xyz.zhouxy.plusone.constant.EntityStatus;
|
||||||
import xyz.zhouxy.plusone.domain.IWithOrderNumber;
|
import xyz.zhouxy.plusone.domain.IWithOrderNumber;
|
||||||
import xyz.zhouxy.plusone.exception.DataNotExistException;
|
import xyz.zhouxy.plusone.exception.DataNotExistException;
|
||||||
import xyz.zhouxy.plusone.system.application.exception.UnsupportedMenuTypeException;
|
import xyz.zhouxy.plusone.system.application.exception.UnsupportedMenuTypeException;
|
||||||
|
import xyz.zhouxy.plusone.system.application.query.MenuQueries;
|
||||||
|
import xyz.zhouxy.plusone.system.application.query.params.MenuQueryParams;
|
||||||
import xyz.zhouxy.plusone.system.application.query.result.MenuViewObject;
|
import xyz.zhouxy.plusone.system.application.query.result.MenuViewObject;
|
||||||
import xyz.zhouxy.plusone.system.application.service.command.CreateMenuCommand;
|
import xyz.zhouxy.plusone.system.application.service.command.CreateMenuCommand;
|
||||||
import xyz.zhouxy.plusone.system.application.service.command.UpdateMenuCommand;
|
import xyz.zhouxy.plusone.system.application.service.command.UpdateMenuCommand;
|
||||||
@@ -35,10 +38,12 @@ public class MenuManagementService {
|
|||||||
|
|
||||||
private final MenuService menuService;
|
private final MenuService menuService;
|
||||||
private final MenuRepository menuRepository;
|
private final MenuRepository menuRepository;
|
||||||
|
private final MenuQueries menuQueries;
|
||||||
|
|
||||||
MenuManagementService(MenuService roleRepository, MenuRepository menuRepository) {
|
MenuManagementService(MenuService menuService, MenuRepository menuRepository, MenuQueries menuQueries) {
|
||||||
this.menuService = roleRepository;
|
this.menuService = menuService;
|
||||||
this.menuRepository = menuRepository;
|
this.menuRepository = menuRepository;
|
||||||
|
this.menuQueries = menuQueries;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ==================== create ====================
|
// ==================== create ====================
|
||||||
@@ -66,7 +71,7 @@ public class MenuManagementService {
|
|||||||
command.getIcon(),
|
command.getIcon(),
|
||||||
command.getHidden(),
|
command.getHidden(),
|
||||||
command.getOrderNumber(),
|
command.getOrderNumber(),
|
||||||
command.getStatus(),
|
EntityStatus.of(command.getStatus()),
|
||||||
command.getRemarks());
|
command.getRemarks());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -79,7 +84,7 @@ public class MenuManagementService {
|
|||||||
command.getIcon(),
|
command.getIcon(),
|
||||||
command.getHidden(),
|
command.getHidden(),
|
||||||
command.getOrderNumber(),
|
command.getOrderNumber(),
|
||||||
command.getStatus(),
|
EntityStatus.of(command.getStatus()),
|
||||||
command.getComponent(),
|
command.getComponent(),
|
||||||
command.getResource(),
|
command.getResource(),
|
||||||
command.getCache(),
|
command.getCache(),
|
||||||
@@ -107,7 +112,7 @@ public class MenuManagementService {
|
|||||||
command.getIcon(),
|
command.getIcon(),
|
||||||
command.getHidden(),
|
command.getHidden(),
|
||||||
command.getOrderNumber(),
|
command.getOrderNumber(),
|
||||||
command.getStatus(),
|
EntityStatus.of(command.getStatus()),
|
||||||
command.getComponent(),
|
command.getComponent(),
|
||||||
command.getResource(),
|
command.getResource(),
|
||||||
command.getCache(),
|
command.getCache(),
|
||||||
@@ -122,6 +127,11 @@ public class MenuManagementService {
|
|||||||
return MenuViewObject.of(menu.orElseThrow(DataNotExistException::new));
|
return MenuViewObject.of(menu.orElseThrow(DataNotExistException::new));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Transactional(propagation = Propagation.SUPPORTS)
|
||||||
|
public List<MenuViewObject> queryMenuTree(MenuQueryParams queryParams) {
|
||||||
|
return menuQueries.queryMenuTree(queryParams);
|
||||||
|
}
|
||||||
|
|
||||||
@Transactional(propagation = Propagation.SUPPORTS)
|
@Transactional(propagation = Propagation.SUPPORTS)
|
||||||
public List<MenuViewObject> queryByAccountId(Long accountId) {
|
public List<MenuViewObject> queryByAccountId(Long accountId) {
|
||||||
var menus = menuService.queryAllMenuListByAccountId(accountId);
|
var menus = menuService.queryAllMenuListByAccountId(accountId);
|
||||||
|
@@ -5,6 +5,7 @@ import java.util.Set;
|
|||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import xyz.zhouxy.plusone.system.application.common.exception.UnsupportedPrincipalTypeException;
|
||||||
import xyz.zhouxy.plusone.system.application.common.util.PrincipalType;
|
import xyz.zhouxy.plusone.system.application.common.util.PrincipalType;
|
||||||
import xyz.zhouxy.plusone.system.application.common.util.PrincipalUtil;
|
import xyz.zhouxy.plusone.system.application.common.util.PrincipalUtil;
|
||||||
import xyz.zhouxy.plusone.system.application.exception.AccountRegisterException;
|
import xyz.zhouxy.plusone.system.application.exception.AccountRegisterException;
|
||||||
@@ -16,9 +17,7 @@ import xyz.zhouxy.plusone.system.domain.model.account.AccountStatus;
|
|||||||
import xyz.zhouxy.plusone.system.domain.model.account.Email;
|
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.MobilePhone;
|
||||||
import xyz.zhouxy.plusone.system.domain.model.account.Password;
|
import xyz.zhouxy.plusone.system.domain.model.account.Password;
|
||||||
import xyz.zhouxy.plusone.system.domain.model.account.Sex;
|
|
||||||
import xyz.zhouxy.plusone.system.domain.model.account.Username;
|
import xyz.zhouxy.plusone.system.domain.model.account.Username;
|
||||||
import xyz.zhouxy.plusone.validator.InvalidInputException;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 注册账号服务
|
* 注册账号服务
|
||||||
@@ -70,7 +69,7 @@ public class RegisterAccountService {
|
|||||||
throw AccountRegisterException.emailAlreadyExists(mobilePhone.value());
|
throw AccountRegisterException.emailAlreadyExists(mobilePhone.value());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
throw InvalidInputException.unsupportedPrincipalTypeException();
|
throw new UnsupportedPrincipalTypeException();
|
||||||
}
|
}
|
||||||
|
|
||||||
verifyService.checkCode(emailOrMobilePhone, command.getCode());
|
verifyService.checkCode(emailOrMobilePhone, command.getCode());
|
||||||
@@ -82,7 +81,9 @@ public class RegisterAccountService {
|
|||||||
Password.newPassword(command.getPassword(), command.getReenteredPassword()),
|
Password.newPassword(command.getPassword(), command.getReenteredPassword()),
|
||||||
AccountStatus.AVAILABLE,
|
AccountStatus.AVAILABLE,
|
||||||
Set.of(DEFAULT_ROLE_ID),
|
Set.of(DEFAULT_ROLE_ID),
|
||||||
AccountInfo.of(command.getNickname(), null, Sex.UNSET));
|
AccountInfo.builder()
|
||||||
|
.nickname(command.getNickname())
|
||||||
|
.build());
|
||||||
accountRepository.save(accountToSave);
|
accountRepository.save(accountToSave);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -93,7 +94,7 @@ public class RegisterAccountService {
|
|||||||
} else if (principalType == PrincipalType.MOBILE_PHONE) {
|
} else if (principalType == PrincipalType.MOBILE_PHONE) {
|
||||||
verifyService.sendCodeToMobilePhone(MobilePhone.of(principal));
|
verifyService.sendCodeToMobilePhone(MobilePhone.of(principal));
|
||||||
} else {
|
} else {
|
||||||
throw InvalidInputException.unsupportedPrincipalTypeException();
|
throw new UnsupportedPrincipalTypeException();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -10,6 +10,7 @@ import org.springframework.stereotype.Service;
|
|||||||
import org.springframework.transaction.annotation.Propagation;
|
import org.springframework.transaction.annotation.Propagation;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import xyz.zhouxy.plusone.constant.EntityStatus;
|
||||||
import xyz.zhouxy.plusone.exception.DataNotExistException;
|
import xyz.zhouxy.plusone.exception.DataNotExistException;
|
||||||
import xyz.zhouxy.plusone.system.application.query.RoleQueries;
|
import xyz.zhouxy.plusone.system.application.query.RoleQueries;
|
||||||
import xyz.zhouxy.plusone.system.application.query.params.RoleQueryParams;
|
import xyz.zhouxy.plusone.system.application.query.params.RoleQueryParams;
|
||||||
@@ -54,7 +55,7 @@ public class RoleManagementService {
|
|||||||
Role roleToCreate = Role.newInstance(
|
Role roleToCreate = Role.newInstance(
|
||||||
command.getName(),
|
command.getName(),
|
||||||
command.getIdentifier(),
|
command.getIdentifier(),
|
||||||
command.getStatus(),
|
EntityStatus.of(command.getStatus()),
|
||||||
command.getRemarks(),
|
command.getRemarks(),
|
||||||
menuRefs,
|
menuRefs,
|
||||||
permissionRefs);
|
permissionRefs);
|
||||||
@@ -67,7 +68,7 @@ public class RoleManagementService {
|
|||||||
roleToUpdate.update(
|
roleToUpdate.update(
|
||||||
command.getName(),
|
command.getName(),
|
||||||
command.getIdentifier(),
|
command.getIdentifier(),
|
||||||
command.getStatus(),
|
EntityStatus.of(command.getStatus()),
|
||||||
command.getRemarks(),
|
command.getRemarks(),
|
||||||
Set.copyOf(_menuRepository.findByIdIn(command.getMenus())),
|
Set.copyOf(_menuRepository.findByIdIn(command.getMenus())),
|
||||||
Set.copyOf(_menuRepository.findPermissionsByIdIn(command.getPermissions())));
|
Set.copyOf(_menuRepository.findPermissionsByIdIn(command.getPermissions())));
|
||||||
|
@@ -10,10 +10,8 @@ import javax.validation.constraints.Pattern;
|
|||||||
import org.hibernate.validator.constraints.URL;
|
import org.hibernate.validator.constraints.URL;
|
||||||
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import xyz.zhouxy.plusone.constant.RegexConsts;
|
import xyz.zhouxy.plusone.commons.constant.RegexConsts;
|
||||||
import xyz.zhouxy.plusone.domain.ICommand;
|
import xyz.zhouxy.plusone.domain.ICommand;
|
||||||
import xyz.zhouxy.plusone.system.domain.model.account.AccountStatus;
|
|
||||||
import xyz.zhouxy.plusone.system.domain.model.account.Sex;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建账号命令
|
* 创建账号命令
|
||||||
@@ -41,7 +39,7 @@ public class CreateAccountCommand implements ICommand {
|
|||||||
String passwordConfirmation;
|
String passwordConfirmation;
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
AccountStatus status;
|
Integer status;
|
||||||
|
|
||||||
Set<Long> roleRefs;
|
Set<Long> roleRefs;
|
||||||
|
|
||||||
@@ -52,5 +50,5 @@ public class CreateAccountCommand implements ICommand {
|
|||||||
@URL
|
@URL
|
||||||
String avatar;
|
String avatar;
|
||||||
|
|
||||||
Sex sex;
|
Integer sex;
|
||||||
}
|
}
|
||||||
|
@@ -5,7 +5,6 @@ import javax.validation.constraints.NotNull;
|
|||||||
|
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
import xyz.zhouxy.plusone.constant.EntityStatus;
|
|
||||||
import xyz.zhouxy.plusone.domain.ICommand;
|
import xyz.zhouxy.plusone.domain.ICommand;
|
||||||
import xyz.zhouxy.plusone.system.domain.model.menu.Menu.MenuType;
|
import xyz.zhouxy.plusone.system.domain.model.menu.Menu.MenuType;
|
||||||
|
|
||||||
@@ -42,7 +41,7 @@ public class CreateMenuCommand implements ICommand {
|
|||||||
private Integer orderNumber;
|
private Integer orderNumber;
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private EntityStatus status;
|
private Integer status;
|
||||||
|
|
||||||
private String component;
|
private String component;
|
||||||
|
|
||||||
|
@@ -6,7 +6,6 @@ import javax.validation.constraints.NotBlank;
|
|||||||
import javax.validation.constraints.NotNull;
|
import javax.validation.constraints.NotNull;
|
||||||
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import xyz.zhouxy.plusone.constant.EntityStatus;
|
|
||||||
import xyz.zhouxy.plusone.domain.ICommand;
|
import xyz.zhouxy.plusone.domain.ICommand;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -23,7 +22,7 @@ public class CreateRoleCommand implements ICommand {
|
|||||||
String identifier;
|
String identifier;
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
EntityStatus status;
|
Integer status;
|
||||||
String remarks;
|
String remarks;
|
||||||
|
|
||||||
Set<Long> menus;
|
Set<Long> menus;
|
||||||
|
@@ -4,7 +4,7 @@ import javax.validation.constraints.NotBlank;
|
|||||||
import javax.validation.constraints.Pattern;
|
import javax.validation.constraints.Pattern;
|
||||||
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import xyz.zhouxy.plusone.constant.RegexConsts;
|
import xyz.zhouxy.plusone.commons.constant.RegexConsts;
|
||||||
import xyz.zhouxy.plusone.domain.ICommand;
|
import xyz.zhouxy.plusone.domain.ICommand;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -6,9 +6,8 @@ import javax.validation.constraints.Pattern;
|
|||||||
import org.hibernate.validator.constraints.URL;
|
import org.hibernate.validator.constraints.URL;
|
||||||
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import xyz.zhouxy.plusone.constant.RegexConsts;
|
import xyz.zhouxy.plusone.commons.constant.RegexConsts;
|
||||||
import xyz.zhouxy.plusone.domain.ICommand;
|
import xyz.zhouxy.plusone.domain.ICommand;
|
||||||
import xyz.zhouxy.plusone.system.domain.model.account.Sex;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 更新账号信息命令
|
* 更新账号信息命令
|
||||||
@@ -27,5 +26,5 @@ public class UpdateAccountCommand implements ICommand {
|
|||||||
@URL
|
@URL
|
||||||
String avatar;
|
String avatar;
|
||||||
|
|
||||||
Sex sex;
|
Integer sex;
|
||||||
}
|
}
|
||||||
|
@@ -5,7 +5,6 @@ import javax.validation.constraints.NotNull;
|
|||||||
|
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
import xyz.zhouxy.plusone.constant.EntityStatus;
|
|
||||||
import xyz.zhouxy.plusone.domain.ICommand;
|
import xyz.zhouxy.plusone.domain.ICommand;
|
||||||
import xyz.zhouxy.plusone.system.domain.model.menu.Menu.MenuType;
|
import xyz.zhouxy.plusone.system.domain.model.menu.Menu.MenuType;
|
||||||
|
|
||||||
@@ -46,7 +45,7 @@ public class UpdateMenuCommand implements ICommand {
|
|||||||
private Integer orderNumber;
|
private Integer orderNumber;
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private EntityStatus status;
|
private Integer status;
|
||||||
|
|
||||||
private String component;
|
private String component;
|
||||||
|
|
||||||
|
@@ -6,7 +6,6 @@ import javax.validation.constraints.NotBlank;
|
|||||||
import javax.validation.constraints.NotNull;
|
import javax.validation.constraints.NotNull;
|
||||||
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import xyz.zhouxy.plusone.constant.EntityStatus;
|
|
||||||
import xyz.zhouxy.plusone.domain.ICommand;
|
import xyz.zhouxy.plusone.domain.ICommand;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -27,7 +26,7 @@ public class UpdateRoleCommand implements ICommand {
|
|||||||
String identifier;
|
String identifier;
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
EntityStatus status;
|
Integer status;
|
||||||
|
|
||||||
@NotBlank
|
@NotBlank
|
||||||
String remarks;
|
String remarks;
|
||||||
|
@@ -4,7 +4,7 @@ import java.util.List;
|
|||||||
|
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import xyz.zhouxy.plusone.constant.RegexConsts;
|
import xyz.zhouxy.plusone.commons.constant.PatternConsts;
|
||||||
import xyz.zhouxy.plusone.system.application.service.command.LoginByOtpCommand;
|
import xyz.zhouxy.plusone.system.application.service.command.LoginByOtpCommand;
|
||||||
import xyz.zhouxy.plusone.validator.BaseValidator;
|
import xyz.zhouxy.plusone.validator.BaseValidator;
|
||||||
import xyz.zhouxy.plusone.validator.DtoValidator;
|
import xyz.zhouxy.plusone.validator.DtoValidator;
|
||||||
@@ -16,10 +16,10 @@ public class LoginByOtpCommandValidator extends BaseValidator<LoginByOtpCommand>
|
|||||||
ruleForString(LoginByOtpCommand::getPrincipal)
|
ruleForString(LoginByOtpCommand::getPrincipal)
|
||||||
.notNull("输入邮箱地址或手机号")
|
.notNull("输入邮箱地址或手机号")
|
||||||
.notEmpty("输入邮箱地址或手机号")
|
.notEmpty("输入邮箱地址或手机号")
|
||||||
.matchesOr(List.of(RegexConsts.EMAIL, RegexConsts.MOBILE_PHONE), "输入用户名、邮箱地址或手机号");
|
.matchesOr(List.of(PatternConsts.EMAIL, PatternConsts.MOBILE_PHONE), "输入用户名、邮箱地址或手机号");
|
||||||
ruleForString(LoginByOtpCommand::getOtp)
|
ruleForString(LoginByOtpCommand::getOtp)
|
||||||
.notNull("验证码不能为空")
|
.notNull("验证码不能为空")
|
||||||
.notEmpty("验证码不能为空")
|
.notEmpty("验证码不能为空")
|
||||||
.matches(RegexConsts.CAPTCHA, "验证码格式不正确");
|
.matches(PatternConsts.CAPTCHA, "验证码格式不正确");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -2,7 +2,8 @@ package xyz.zhouxy.plusone.system.application.service.command.validator;
|
|||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import xyz.zhouxy.plusone.constant.RegexConsts;
|
|
||||||
|
import xyz.zhouxy.plusone.commons.constant.PatternConsts;
|
||||||
import xyz.zhouxy.plusone.system.application.service.command.LoginByPasswordCommand;
|
import xyz.zhouxy.plusone.system.application.service.command.LoginByPasswordCommand;
|
||||||
import xyz.zhouxy.plusone.validator.BaseValidator;
|
import xyz.zhouxy.plusone.validator.BaseValidator;
|
||||||
import xyz.zhouxy.plusone.validator.DtoValidator;
|
import xyz.zhouxy.plusone.validator.DtoValidator;
|
||||||
@@ -14,11 +15,11 @@ public class LoginByPasswordCommandValidator extends BaseValidator<LoginByPasswo
|
|||||||
ruleForString(LoginByPasswordCommand::getPrincipal)
|
ruleForString(LoginByPasswordCommand::getPrincipal)
|
||||||
.notNull("输入用户名、邮箱地址或手机号")
|
.notNull("输入用户名、邮箱地址或手机号")
|
||||||
.notEmpty("输入用户名、邮箱地址或手机号")
|
.notEmpty("输入用户名、邮箱地址或手机号")
|
||||||
.matchesOr(List.of(RegexConsts.USERNAME, RegexConsts.EMAIL, RegexConsts.MOBILE_PHONE),
|
.matchesOr(List.of(PatternConsts.USERNAME, PatternConsts.EMAIL, PatternConsts.MOBILE_PHONE),
|
||||||
"输入用户名、邮箱地址或手机号");
|
"输入用户名、邮箱地址或手机号");
|
||||||
ruleForString(LoginByPasswordCommand::getPassword)
|
ruleForString(LoginByPasswordCommand::getPassword)
|
||||||
.notNull("密码不能为空")
|
.notNull("密码不能为空")
|
||||||
.notEmpty("密码不能为空")
|
.notEmpty("密码不能为空")
|
||||||
.matches(RegexConsts.PASSWORD, "密码格式不正确");
|
.matches(PatternConsts.PASSWORD, "密码格式不正确");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -14,10 +14,6 @@
|
|||||||
<groupId>xyz.zhouxy</groupId>
|
<groupId>xyz.zhouxy</groupId>
|
||||||
<artifactId>plusone-basic-common</artifactId>
|
<artifactId>plusone-basic-common</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>cn.hutool</groupId>
|
|
||||||
<artifactId>hutool-crypto</artifactId>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
@@ -1,11 +1,14 @@
|
|||||||
package xyz.zhouxy.plusone.system.util;
|
package xyz.zhouxy.plusone.system.util;
|
||||||
|
|
||||||
|
import java.math.BigInteger;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.security.MessageDigest;
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
|
|
||||||
import cn.hutool.core.util.RandomUtil;
|
import xyz.zhouxy.plusone.exception.SysException;
|
||||||
import cn.hutool.crypto.digest.DigestUtil;
|
import xyz.zhouxy.plusone.util.RandomUtil;
|
||||||
import xyz.zhouxy.plusone.constant.ErrorCodeConsts;
|
|
||||||
import xyz.zhouxy.plusone.exception.PlusoneException;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 密码工具类
|
* 密码工具类
|
||||||
@@ -13,7 +16,8 @@ import xyz.zhouxy.plusone.exception.PlusoneException;
|
|||||||
* @author <a href="https://gitee.com/zhouxy108">ZhouXY</a>
|
* @author <a href="https://gitee.com/zhouxy108">ZhouXY</a>
|
||||||
*/
|
*/
|
||||||
public final class PasswordUtil {
|
public final class PasswordUtil {
|
||||||
private static final String SALT_BASE_STRING = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ~`!@#$%^&*()_-+={}[]|\\:;\"',.<>?/";
|
private static final char[] SALT_BASE_CHAR_ARRAY = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ~`!@#$%^&*()_-+={}[]|\\:;\"',.<>?/"
|
||||||
|
.toCharArray();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 将密码和随机盐混合,并进行哈希加密。
|
* 将密码和随机盐混合,并进行哈希加密。
|
||||||
@@ -28,12 +32,12 @@ public final class PasswordUtil {
|
|||||||
int i = length > 0 ? length / 2 : 0;
|
int i = length > 0 ? length / 2 : 0;
|
||||||
var passwordWithSalt = salt.substring(0, i)
|
var passwordWithSalt = salt.substring(0, i)
|
||||||
+ password
|
+ password
|
||||||
+ salt.substring(1);
|
+ salt.substring(i);
|
||||||
String sha512Hex = DigestUtil.sha512Hex(passwordWithSalt);
|
try {
|
||||||
if (sha512Hex == null) {
|
return sha512Hex(passwordWithSalt);
|
||||||
throw new PlusoneException(ErrorCodeConsts.DEFAULT_ERROR_CODE, "未知错误:哈希加密失败!");
|
} catch (NoSuchAlgorithmException e) {
|
||||||
|
throw new SysException(e);
|
||||||
}
|
}
|
||||||
return sha512Hex;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -42,11 +46,20 @@ public final class PasswordUtil {
|
|||||||
* @return 生成的随机盐
|
* @return 生成的随机盐
|
||||||
*/
|
*/
|
||||||
public static String generateRandomSalt() {
|
public static String generateRandomSalt() {
|
||||||
return RandomUtil.randomString(SALT_BASE_STRING, 24);
|
return RandomUtil.randomStr(SALT_BASE_CHAR_ARRAY, 24);
|
||||||
}
|
}
|
||||||
|
|
||||||
private PasswordUtil() {
|
private PasswordUtil() {
|
||||||
// 不允许实例化
|
// 不允许实例化
|
||||||
throw new IllegalStateException("Utility class");
|
throw new IllegalStateException("Utility class");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
@SuppressWarnings("null")
|
||||||
|
private static String sha512Hex(String data) throws NoSuchAlgorithmException {
|
||||||
|
MessageDigest messageDigest = MessageDigest.getInstance("SHA-512");
|
||||||
|
messageDigest.update(data.getBytes(StandardCharsets.UTF_8));
|
||||||
|
byte[] result = messageDigest.digest();
|
||||||
|
return new BigInteger(1, result).toString(16);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -93,11 +93,19 @@ public class Account extends AggregateRoot<Long> implements IWithVersion {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void setAccountInfo(Nickname nickname, URL avatar, Sex sex) {
|
public void setAccountInfo(Nickname nickname, URL avatar, Sex sex) {
|
||||||
this.accountInfo = AccountInfo.of(nickname, avatar, sex);
|
this.accountInfo = AccountInfo.builder()
|
||||||
|
.nickname(nickname)
|
||||||
|
.avatar(avatar)
|
||||||
|
.sex(sex)
|
||||||
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setAccountInfo(String nickname, String avatar, Sex sex) {
|
public void setAccountInfo(String nickname, String avatar, Sex sex) {
|
||||||
this.accountInfo = AccountInfo.of(nickname, avatar, sex);
|
this.accountInfo = AccountInfo.builder()
|
||||||
|
.nickname(nickname)
|
||||||
|
.avatar(avatar)
|
||||||
|
.sex(sex)
|
||||||
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -5,7 +5,9 @@ import java.net.URL;
|
|||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
import lombok.Getter;
|
import javax.annotation.Nonnull;
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
import lombok.ToString;
|
import lombok.ToString;
|
||||||
import xyz.zhouxy.plusone.domain.IValueObject;
|
import xyz.zhouxy.plusone.domain.IValueObject;
|
||||||
|
|
||||||
@@ -17,30 +19,19 @@ import xyz.zhouxy.plusone.domain.IValueObject;
|
|||||||
@ToString
|
@ToString
|
||||||
public class AccountInfo implements IValueObject {
|
public class AccountInfo implements IValueObject {
|
||||||
|
|
||||||
|
@Nullable
|
||||||
private final Nickname nickname;
|
private final Nickname nickname;
|
||||||
|
@Nullable
|
||||||
private final URL avatar;
|
private final URL avatar;
|
||||||
private final @Getter Sex sex;
|
@Nonnull
|
||||||
|
private final Sex sex;
|
||||||
|
|
||||||
private AccountInfo(Nickname nickname, URL avatar, Sex sex) {
|
private AccountInfo(@Nullable Nickname nickname, @Nullable URL avatar, @Nullable Sex sex) {
|
||||||
this.nickname = nickname;
|
this.nickname = nickname;
|
||||||
this.avatar = avatar;
|
this.avatar = avatar;
|
||||||
this.sex = Objects.nonNull(sex) ? sex : Sex.UNSET;
|
this.sex = Objects.nonNull(sex) ? sex : Sex.UNSET;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static AccountInfo of(Nickname nickname, URL avatar, Sex sex) {
|
|
||||||
return new AccountInfo(nickname, avatar, sex);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static AccountInfo of(String nickname, String avatar, Sex sex) {
|
|
||||||
URL avatarURL;
|
|
||||||
try {
|
|
||||||
avatarURL = Objects.nonNull(avatar) ? new URL(avatar) : null;
|
|
||||||
} catch (MalformedURLException e) {
|
|
||||||
throw new IllegalArgumentException(e);
|
|
||||||
}
|
|
||||||
return new AccountInfo(Nickname.ofNullable(nickname), avatarURL, sex);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Optional<Nickname> getNickname() {
|
public Optional<Nickname> getNickname() {
|
||||||
return Optional.ofNullable(nickname);
|
return Optional.ofNullable(nickname);
|
||||||
}
|
}
|
||||||
@@ -48,4 +39,54 @@ public class AccountInfo implements IValueObject {
|
|||||||
public Optional<URL> getAvatar() {
|
public Optional<URL> getAvatar() {
|
||||||
return Optional.ofNullable(avatar);
|
return Optional.ofNullable(avatar);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
public Sex getSex() {
|
||||||
|
return this.sex;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Builder
|
||||||
|
|
||||||
|
public static Builder builder() {
|
||||||
|
return new Builder();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Builder {
|
||||||
|
private Nickname nickname;
|
||||||
|
private URL avatar;
|
||||||
|
private Sex sex;
|
||||||
|
|
||||||
|
public Builder nickname(@Nullable Nickname nickname) {
|
||||||
|
this.nickname = nickname;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder nickname(@Nullable String nickname) {
|
||||||
|
return nickname(Nickname.ofNullable(nickname));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder avatar(@Nullable URL avatar) {
|
||||||
|
this.avatar = avatar;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder avatar(@Nullable String avatar) {
|
||||||
|
URL avatarURL;
|
||||||
|
try {
|
||||||
|
avatarURL = Objects.nonNull(avatar) ? new URL(avatar) : null;
|
||||||
|
} catch (MalformedURLException e) {
|
||||||
|
throw new IllegalArgumentException(e);
|
||||||
|
}
|
||||||
|
return avatar(avatarURL);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder sex(@Nullable Sex sex) {
|
||||||
|
this.sex = sex;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AccountInfo build() {
|
||||||
|
return new AccountInfo(this.nickname, this.avatar, this.sex);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,9 +1,12 @@
|
|||||||
package xyz.zhouxy.plusone.system.domain.model.account;
|
package xyz.zhouxy.plusone.system.domain.model.account;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
import xyz.zhouxy.plusone.commons.util.Enumeration;
|
||||||
import xyz.zhouxy.plusone.domain.IValueObject;
|
import xyz.zhouxy.plusone.domain.IValueObject;
|
||||||
import xyz.zhouxy.plusone.util.Enumeration;
|
|
||||||
import xyz.zhouxy.plusone.util.EnumerationValuesHolder;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 账号状态
|
* 账号状态
|
||||||
@@ -11,19 +14,25 @@ import xyz.zhouxy.plusone.util.EnumerationValuesHolder;
|
|||||||
* @author <a href="https://gitee.com/zhouxy108">ZhouXY</a>
|
* @author <a href="https://gitee.com/zhouxy108">ZhouXY</a>
|
||||||
*/
|
*/
|
||||||
@Getter
|
@Getter
|
||||||
public class AccountStatus extends Enumeration<AccountStatus> implements IValueObject {
|
public final class AccountStatus extends Enumeration<AccountStatus> implements IValueObject {
|
||||||
|
|
||||||
private AccountStatus(int value, String name) {
|
private AccountStatus(int id, @Nonnull String name) {
|
||||||
super(value, name);
|
super(id, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final AccountStatus AVAILABLE = new AccountStatus(0, "账号正常");
|
public static final AccountStatus AVAILABLE = new AccountStatus(0, "账号正常");
|
||||||
public static final AccountStatus LOCKED = new AccountStatus(1, "账号被锁定");
|
public static final AccountStatus LOCKED = new AccountStatus(1, "账号被锁定");
|
||||||
|
|
||||||
private static final EnumerationValuesHolder<AccountStatus> ENUMERATION_VALUES = new EnumerationValuesHolder<>(
|
private static final ValueSet<AccountStatus> VALUE_SET = new ValueSet<>(
|
||||||
new AccountStatus[] { AVAILABLE, LOCKED });
|
AVAILABLE,
|
||||||
|
LOCKED);
|
||||||
|
|
||||||
public static AccountStatus of(int value) {
|
public static AccountStatus of(int id) {
|
||||||
return ENUMERATION_VALUES.get(value);
|
return VALUE_SET.get(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
public static Collection<AccountStatus> constants() {
|
||||||
|
return VALUE_SET.getValues();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,9 +1,10 @@
|
|||||||
package xyz.zhouxy.plusone.system.domain.model.account;
|
package xyz.zhouxy.plusone.system.domain.model.account;
|
||||||
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
import cn.hutool.core.util.DesensitizedUtil;
|
import cn.hutool.core.util.DesensitizedUtil;
|
||||||
import xyz.zhouxy.plusone.constant.RegexConsts;
|
import xyz.zhouxy.plusone.commons.constant.PatternConsts;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 值对象:电子邮箱地址
|
* 值对象:电子邮箱地址
|
||||||
@@ -12,7 +13,7 @@ import xyz.zhouxy.plusone.constant.RegexConsts;
|
|||||||
*/
|
*/
|
||||||
public class Email extends Principal {
|
public class Email extends Principal {
|
||||||
|
|
||||||
public static final String REGEX = RegexConsts.EMAIL;
|
public static final Pattern REGEX = PatternConsts.EMAIL;
|
||||||
|
|
||||||
private Email(String email) {
|
private Email(String email) {
|
||||||
super(REGEX);
|
super(REGEX);
|
||||||
|
@@ -1,9 +1,10 @@
|
|||||||
package xyz.zhouxy.plusone.system.domain.model.account;
|
package xyz.zhouxy.plusone.system.domain.model.account;
|
||||||
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
import cn.hutool.core.util.DesensitizedUtil;
|
import cn.hutool.core.util.DesensitizedUtil;
|
||||||
import xyz.zhouxy.plusone.constant.RegexConsts;
|
import xyz.zhouxy.plusone.commons.constant.PatternConsts;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 值对象:手机号码
|
* 值对象:手机号码
|
||||||
@@ -12,7 +13,7 @@ import xyz.zhouxy.plusone.constant.RegexConsts;
|
|||||||
*/
|
*/
|
||||||
public class MobilePhone extends Principal {
|
public class MobilePhone extends Principal {
|
||||||
|
|
||||||
public static final String REGEX = RegexConsts.MOBILE_PHONE;
|
public static final Pattern REGEX = PatternConsts.MOBILE_PHONE;
|
||||||
|
|
||||||
private MobilePhone(String mobilePhone) {
|
private MobilePhone(String mobilePhone) {
|
||||||
super(REGEX);
|
super(REGEX);
|
||||||
|
@@ -1,8 +1,9 @@
|
|||||||
package xyz.zhouxy.plusone.system.domain.model.account;
|
package xyz.zhouxy.plusone.system.domain.model.account;
|
||||||
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
import xyz.zhouxy.plusone.constant.RegexConsts;
|
import xyz.zhouxy.plusone.commons.constant.PatternConsts;
|
||||||
import xyz.zhouxy.plusone.domain.ValidatableStringRecord;
|
import xyz.zhouxy.plusone.domain.ValidatableStringRecord;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -12,7 +13,7 @@ import xyz.zhouxy.plusone.domain.ValidatableStringRecord;
|
|||||||
*/
|
*/
|
||||||
public class Nickname extends ValidatableStringRecord {
|
public class Nickname extends ValidatableStringRecord {
|
||||||
|
|
||||||
public static final String REGEX = RegexConsts.NICKNAME;
|
public static final Pattern REGEX = PatternConsts.NICKNAME;
|
||||||
|
|
||||||
private Nickname(String value) {
|
private Nickname(String value) {
|
||||||
super(REGEX);
|
super(REGEX);
|
||||||
|
@@ -7,10 +7,9 @@ import javax.annotation.Nonnull;
|
|||||||
|
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
|
|
||||||
import xyz.zhouxy.plusone.constant.ErrorCodeConsts;
|
import xyz.zhouxy.plusone.commons.constant.PatternConsts;
|
||||||
import xyz.zhouxy.plusone.constant.RegexConsts;
|
|
||||||
import xyz.zhouxy.plusone.domain.IValueObject;
|
import xyz.zhouxy.plusone.domain.IValueObject;
|
||||||
import xyz.zhouxy.plusone.exception.PlusoneException;
|
import xyz.zhouxy.plusone.exception.SysException;
|
||||||
import xyz.zhouxy.plusone.system.util.PasswordUtil;
|
import xyz.zhouxy.plusone.system.util.PasswordUtil;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -20,7 +19,7 @@ import xyz.zhouxy.plusone.system.util.PasswordUtil;
|
|||||||
*/
|
*/
|
||||||
public class Password implements IValueObject {
|
public class Password implements IValueObject {
|
||||||
|
|
||||||
private static final Pattern PATTERN = Pattern.compile(RegexConsts.PASSWORD);
|
private static final Pattern PATTERN = PatternConsts.PASSWORD;
|
||||||
private static final String DEFAULT_PASSWORD = "A1b2C3d4";
|
private static final String DEFAULT_PASSWORD = "A1b2C3d4";
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
@@ -37,7 +36,7 @@ public class Password implements IValueObject {
|
|||||||
}
|
}
|
||||||
var salt = PasswordUtil.generateRandomSalt();
|
var salt = PasswordUtil.generateRandomSalt();
|
||||||
if (salt == null) {
|
if (salt == null) {
|
||||||
throw new PlusoneException(ErrorCodeConsts.DEFAULT_ERROR_CODE, "未知错误:生成随机盐失败");
|
throw new SysException("未知错误:生成随机盐失败");
|
||||||
}
|
}
|
||||||
this.saltVal = salt;
|
this.saltVal = salt;
|
||||||
this.passwordVal = PasswordUtil.hashPassword(password, salt);
|
this.passwordVal = PasswordUtil.hashPassword(password, salt);
|
||||||
|
@@ -1,5 +1,7 @@
|
|||||||
package xyz.zhouxy.plusone.system.domain.model.account;
|
package xyz.zhouxy.plusone.system.domain.model.account;
|
||||||
|
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
import xyz.zhouxy.plusone.domain.ValidatableStringRecord;
|
import xyz.zhouxy.plusone.domain.ValidatableStringRecord;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -8,7 +10,7 @@ import xyz.zhouxy.plusone.domain.ValidatableStringRecord;
|
|||||||
* @author <a href="https://gitee.com/zhouxy108">ZhouXY</a>
|
* @author <a href="https://gitee.com/zhouxy108">ZhouXY</a>
|
||||||
*/
|
*/
|
||||||
public abstract class Principal extends ValidatableStringRecord {
|
public abstract class Principal extends ValidatableStringRecord {
|
||||||
protected Principal(String format) {
|
protected Principal(Pattern format) {
|
||||||
super(format);
|
super(format);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,30 +1,38 @@
|
|||||||
package xyz.zhouxy.plusone.system.domain.model.account;
|
package xyz.zhouxy.plusone.system.domain.model.account;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
|
||||||
|
import xyz.zhouxy.plusone.commons.util.Enumeration;
|
||||||
import xyz.zhouxy.plusone.domain.IValueObject;
|
import xyz.zhouxy.plusone.domain.IValueObject;
|
||||||
import xyz.zhouxy.plusone.util.Enumeration;
|
|
||||||
import xyz.zhouxy.plusone.util.EnumerationValuesHolder;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 值对象:性别
|
* 值对象:性别
|
||||||
*
|
*
|
||||||
* @author <a href="https://gitee.com/zhouxy108">ZhouXY</a>
|
* @author <a href="https://gitee.com/zhouxy108">ZhouXY</a>
|
||||||
*/
|
*/
|
||||||
public class Sex extends Enumeration<Sex> implements IValueObject {
|
public final class Sex extends Enumeration<Sex> implements IValueObject {
|
||||||
|
@Nonnull
|
||||||
public static final Sex UNSET = new Sex(0, "未设置");
|
public static final Sex UNSET = new Sex(0, "未设置");
|
||||||
|
@Nonnull
|
||||||
public static final Sex MALE = new Sex(1, "男性");
|
public static final Sex MALE = new Sex(1, "男性");
|
||||||
|
@Nonnull
|
||||||
public static final Sex FEMALE = new Sex(2, "女性");
|
public static final Sex FEMALE = new Sex(2, "女性");
|
||||||
|
|
||||||
private Sex(int value, String name) {
|
private Sex(int id, @Nonnull String name) {
|
||||||
super(value, name);
|
super(id, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static EnumerationValuesHolder<Sex> values = new EnumerationValuesHolder<>(new Sex[] {
|
private static final ValueSet<Sex> VALUE_SET = new ValueSet<>(UNSET, MALE, FEMALE);
|
||||||
UNSET,
|
|
||||||
MALE,
|
|
||||||
FEMALE
|
|
||||||
});
|
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
public static Sex of(int value) {
|
public static Sex of(int value) {
|
||||||
return values.get(value);
|
return VALUE_SET.get(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
public static Collection<Sex> constants() {
|
||||||
|
return VALUE_SET.getValues();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,6 +1,8 @@
|
|||||||
package xyz.zhouxy.plusone.system.domain.model.account;
|
package xyz.zhouxy.plusone.system.domain.model.account;
|
||||||
|
|
||||||
import xyz.zhouxy.plusone.constant.RegexConsts;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
import xyz.zhouxy.plusone.commons.constant.PatternConsts;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 值对象:用户名
|
* 值对象:用户名
|
||||||
@@ -9,7 +11,7 @@ import xyz.zhouxy.plusone.constant.RegexConsts;
|
|||||||
*/
|
*/
|
||||||
public class Username extends Principal {
|
public class Username extends Principal {
|
||||||
|
|
||||||
public static final String REGEX = RegexConsts.USERNAME;
|
public static final Pattern REGEX = PatternConsts.USERNAME;
|
||||||
|
|
||||||
private Username(String username) {
|
private Username(String username) {
|
||||||
super(REGEX);
|
super(REGEX);
|
||||||
|
@@ -94,26 +94,26 @@ public class AccountRepositoryImpl extends JdbcRepositorySupport<Account, Long>
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean exists(Long id) {
|
public boolean exists(Long id) {
|
||||||
return queryExists("SELECT EXISTS (SELECT 1 FROM sys_account WHERE id = :id AND deleted = 0 LIMIT 1)",
|
return queryForBool("SELECT EXISTS (SELECT 1 FROM sys_account WHERE id = :id AND deleted = 0 LIMIT 1)",
|
||||||
"id", id);
|
"id", id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean existsUsername(Username username) {
|
public boolean existsUsername(Username username) {
|
||||||
return queryExists(
|
return queryForBool(
|
||||||
"SELECT EXISTS (SELECT 1 FROM sys_account WHERE username = :username AND deleted = 0 LIMIT 1)",
|
"SELECT EXISTS (SELECT 1 FROM sys_account WHERE username = :username AND deleted = 0 LIMIT 1)",
|
||||||
"username", username.value());
|
"username", username.value());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean existsEmail(Email email) {
|
public boolean existsEmail(Email email) {
|
||||||
return queryExists("SELECT EXISTS (SELECT 1 FROM sys_account WHERE email = :email AND deleted = 0 LIMIT 1)",
|
return queryForBool("SELECT EXISTS (SELECT 1 FROM sys_account WHERE email = :email AND deleted = 0 LIMIT 1)",
|
||||||
"email", email.value());
|
"email", email.value());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean existsMobilePhone(MobilePhone mobilePhone) {
|
public boolean existsMobilePhone(MobilePhone mobilePhone) {
|
||||||
return queryExists(
|
return queryForBool(
|
||||||
"SELECT EXISTS (SELECT 1 FROM sys_account WHERE mobile_phone = :mobile_phone AND deleted = 0 LIMIT 1)",
|
"SELECT EXISTS (SELECT 1 FROM sys_account WHERE mobile_phone = :mobile_phone AND deleted = 0 LIMIT 1)",
|
||||||
"mobile_phone", mobilePhone.value());
|
"mobile_phone", mobilePhone.value());
|
||||||
}
|
}
|
||||||
@@ -176,10 +176,6 @@ public class AccountRepositoryImpl extends JdbcRepositorySupport<Account, Long>
|
|||||||
@Override
|
@Override
|
||||||
protected final Account mapRow(ResultSet rs) throws SQLException {
|
protected final Account mapRow(ResultSet rs) throws SQLException {
|
||||||
long accountId = rs.getLong("id");
|
long accountId = rs.getLong("id");
|
||||||
AccountInfo accountInfo = AccountInfo.of(
|
|
||||||
rs.getString("nickname"),
|
|
||||||
rs.getString("avatar"),
|
|
||||||
Sex.of(rs.getInt("sex")));
|
|
||||||
return new Account(
|
return new Account(
|
||||||
accountId,
|
accountId,
|
||||||
rs.getString("username"),
|
rs.getString("username"),
|
||||||
@@ -187,7 +183,11 @@ public class AccountRepositoryImpl extends JdbcRepositorySupport<Account, Long>
|
|||||||
rs.getString("mobile_phone"),
|
rs.getString("mobile_phone"),
|
||||||
Password.of(rs.getString("password"), rs.getString("salt")),
|
Password.of(rs.getString("password"), rs.getString("salt")),
|
||||||
AccountStatus.of(rs.getInt("status")),
|
AccountStatus.of(rs.getInt("status")),
|
||||||
accountInfo,
|
AccountInfo.builder()
|
||||||
|
.nickname(rs.getString("nickname"))
|
||||||
|
.avatar(rs.getString("avatar"))
|
||||||
|
.sex(Sex.of(rs.getInt("sex")))
|
||||||
|
.build(),
|
||||||
this.accountRoleDAO.selectRoleIdsByAccountId(accountId),
|
this.accountRoleDAO.selectRoleIdsByAccountId(accountId),
|
||||||
rs.getLong("created_by"),
|
rs.getLong("created_by"),
|
||||||
rs.getLong("updated_by"),
|
rs.getLong("updated_by"),
|
||||||
@@ -206,9 +206,9 @@ public class AccountRepositoryImpl extends JdbcRepositorySupport<Account, Long>
|
|||||||
.addValue("password", entity.getPassword().value())
|
.addValue("password", entity.getPassword().value())
|
||||||
.addValue("salt", entity.getPassword().getSalt())
|
.addValue("salt", entity.getPassword().getSalt())
|
||||||
.addValue("avatar", accountInfo.getAvatar().toString())
|
.addValue("avatar", accountInfo.getAvatar().toString())
|
||||||
.addValue("sex", accountInfo.getSex().getValue())
|
.addValue("sex", accountInfo.getSex().getId())
|
||||||
.addValue("nickname", getValueOrNull(accountInfo.getNickname()))
|
.addValue("nickname", getValueOrNull(accountInfo.getNickname()))
|
||||||
.addValue("status", entity.getStatus().getValue())
|
.addValue("status", entity.getStatus().getId())
|
||||||
.addValue("createdBy", entity.getCreatedBy())
|
.addValue("createdBy", entity.getCreatedBy())
|
||||||
.addValue("createTime", now)
|
.addValue("createTime", now)
|
||||||
.addValue("updatedBy", entity.getUpdatedBy())
|
.addValue("updatedBy", entity.getUpdatedBy())
|
||||||
|
@@ -31,7 +31,7 @@ class AccountRoleRefDAO extends PlusoneJdbcDaoSupport {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void insertAccountRoleRefs(Long accountId, Set<Long> roleRefs) {
|
void insertAccountRoleRefs(Long accountId, Set<Long> roleRefs) {
|
||||||
int i = batchUpdate(
|
long i = batchUpdate(
|
||||||
"INSERT INTO sys_account_role (account_id, role_id) VALUES (:accountId, :roleId)",
|
"INSERT INTO sys_account_role (account_id, role_id) VALUES (:accountId, :roleId)",
|
||||||
roleRefs,
|
roleRefs,
|
||||||
(Long roleId) -> new MapSqlParameterSource()
|
(Long roleId) -> new MapSqlParameterSource()
|
||||||
|
@@ -83,7 +83,7 @@ public class DictRepositoryImpl extends JdbcRepositorySupport<Dict, Long> implem
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean exists(Long id) {
|
public boolean exists(Long id) {
|
||||||
return queryExists("SELECT EXISTS (SELECT 1 FROM sys_dict_type WHERE id = :id AND deleted = 0 LIMIT 1)",
|
return queryForBool("SELECT EXISTS (SELECT 1 FROM sys_dict_type WHERE id = :id AND deleted = 0 LIMIT 1)",
|
||||||
new MapSqlParameterSource("id", id));
|
new MapSqlParameterSource("id", id));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -21,11 +21,11 @@ class DictValueDAO extends PlusoneJdbcDaoSupport {
|
|||||||
void updateDictValues(Dict entity) {
|
void updateDictValues(Dict entity) {
|
||||||
update("DELETE FROM sys_dict_value WHERE dict_type = :dictType",
|
update("DELETE FROM sys_dict_value WHERE dict_type = :dictType",
|
||||||
"dictType", entity.getId().orElseThrow());
|
"dictType", entity.getId().orElseThrow());
|
||||||
int i = insertDictValues(entity.getId().orElseThrow(), entity);
|
long i = insertDictValues(entity.getId().orElseThrow(), entity);
|
||||||
assertResultEquals(i, entity.count());
|
assertResultEquals(i, entity.count());
|
||||||
}
|
}
|
||||||
|
|
||||||
int insertDictValues(Long dictId, Dict entity) {
|
long insertDictValues(Long dictId, Dict entity) {
|
||||||
if (Objects.isNull(dictId) || Objects.isNull(entity) || CollectionUtils.isEmpty(entity.getValues())) {
|
if (Objects.isNull(dictId) || Objects.isNull(entity) || CollectionUtils.isEmpty(entity.getValues())) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@@ -8,7 +8,6 @@ import java.time.LocalDateTime;
|
|||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
@@ -16,6 +15,7 @@ import javax.annotation.Nonnull;
|
|||||||
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
|
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
|
||||||
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
|
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
|
||||||
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
|
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
|
||||||
|
import org.springframework.util.CollectionUtils;
|
||||||
|
|
||||||
import cn.hutool.core.util.IdUtil;
|
import cn.hutool.core.util.IdUtil;
|
||||||
import xyz.zhouxy.plusone.jdbc.JdbcEntityDaoSupport;
|
import xyz.zhouxy.plusone.jdbc.JdbcEntityDaoSupport;
|
||||||
@@ -80,7 +80,7 @@ class ActionDAO extends JdbcEntityDaoSupport<Action, Long> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Collection<Action> selectActionsByIdIn(Collection<Long> actionIds) {
|
Collection<Action> selectActionsByIdIn(Collection<Long> actionIds) {
|
||||||
if (Objects.isNull(actionIds) || actionIds.isEmpty()) {
|
if (CollectionUtils.isEmpty(actionIds)) {
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
return queryForList("""
|
return queryForList("""
|
||||||
|
@@ -7,7 +7,6 @@ import java.sql.SQLException;
|
|||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
@@ -15,14 +14,15 @@ import javax.annotation.Nonnull;
|
|||||||
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
|
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
|
||||||
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
|
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
|
||||||
import org.springframework.stereotype.Repository;
|
import org.springframework.stereotype.Repository;
|
||||||
|
import org.springframework.util.CollectionUtils;
|
||||||
|
|
||||||
import cn.hutool.core.util.IdUtil;
|
import cn.hutool.core.util.IdUtil;
|
||||||
|
import xyz.zhouxy.plusone.commons.util.EnumUtil;
|
||||||
import xyz.zhouxy.plusone.constant.EntityStatus;
|
import xyz.zhouxy.plusone.constant.EntityStatus;
|
||||||
import xyz.zhouxy.plusone.exception.DataNotExistException;
|
import xyz.zhouxy.plusone.exception.DataNotExistException;
|
||||||
import xyz.zhouxy.plusone.jdbc.JdbcRepositorySupport;
|
import xyz.zhouxy.plusone.jdbc.JdbcRepositorySupport;
|
||||||
import xyz.zhouxy.plusone.system.domain.model.menu.Menu.MenuType;
|
import xyz.zhouxy.plusone.system.domain.model.menu.Menu.MenuType;
|
||||||
import xyz.zhouxy.plusone.util.AssertResult;
|
import xyz.zhouxy.plusone.util.AssertResult;
|
||||||
import xyz.zhouxy.plusone.util.EnumUtil;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MenuRepository 实现类
|
* MenuRepository 实现类
|
||||||
@@ -115,13 +115,13 @@ public class MenuRepositoryImpl extends JdbcRepositorySupport<Menu, Long> implem
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean exists(Long id) {
|
public boolean exists(Long id) {
|
||||||
return queryExists("SELECT EXISTS (SELECT 1 FROM sys_menu WHERE id = :id AND deleted = 0 LIMIT 1)",
|
return queryForBool("SELECT EXISTS (SELECT 1 FROM sys_menu WHERE id = :id AND deleted = 0 LIMIT 1)",
|
||||||
"id", id);
|
"id", id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Collection<Menu> findByIdIn(Collection<Long> ids) {
|
public Collection<Menu> findByIdIn(Collection<Long> ids) {
|
||||||
if (Objects.isNull(ids) || ids.isEmpty()) {
|
if (CollectionUtils.isEmpty(ids)) {
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
return queryForList("""
|
return queryForList("""
|
||||||
@@ -188,7 +188,7 @@ public class MenuRepositoryImpl extends JdbcRepositorySupport<Menu, Long> implem
|
|||||||
.addValue("icon", entity.getIcon())
|
.addValue("icon", entity.getIcon())
|
||||||
.addValue("hidden", entity.isHidden())
|
.addValue("hidden", entity.isHidden())
|
||||||
.addValue("orderNumber", entity.getOrderNumber())
|
.addValue("orderNumber", entity.getOrderNumber())
|
||||||
.addValue("status", entity.getStatus().getValue())
|
.addValue("status", entity.getStatus().getId())
|
||||||
.addValue("remarks", entity.getRemarks())
|
.addValue("remarks", entity.getRemarks())
|
||||||
.addValue("component", entity.getComponent())
|
.addValue("component", entity.getComponent())
|
||||||
.addValue("cache", entity.getCache())
|
.addValue("cache", entity.getCache())
|
||||||
|
@@ -29,7 +29,7 @@ class RoleMenuRefDAO extends PlusoneJdbcDaoSupport {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void saveRoleMenuRefs(Long roleId, Role entity) {
|
void saveRoleMenuRefs(Long roleId, Role entity) {
|
||||||
int i = batchUpdate(
|
long i = batchUpdate(
|
||||||
"INSERT INTO sys_role_menu(role_id, menu_id) VALUES (:roleId, :menuId)",
|
"INSERT INTO sys_role_menu(role_id, menu_id) VALUES (:roleId, :menuId)",
|
||||||
entity.getMenus(),
|
entity.getMenus(),
|
||||||
menuRef -> new MapSqlParameterSource()
|
menuRef -> new MapSqlParameterSource()
|
||||||
|
@@ -30,7 +30,7 @@ class RolePermissionRefDAO extends PlusoneJdbcDaoSupport {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void saveRolePermissionRefs(Long roleId, Role entity) {
|
void saveRolePermissionRefs(Long roleId, Role entity) {
|
||||||
int i = batchUpdate(
|
long i = batchUpdate(
|
||||||
"INSERT INTO sys_role_permission(role_id, permission_id) VALUES (:roleId, :permissionId)",
|
"INSERT INTO sys_role_permission(role_id, permission_id) VALUES (:roleId, :permissionId)",
|
||||||
entity.getPermissions(),
|
entity.getPermissions(),
|
||||||
actionRef -> new MapSqlParameterSource()
|
actionRef -> new MapSqlParameterSource()
|
||||||
|
@@ -60,7 +60,7 @@ public class RoleRepositoryImpl extends JdbcRepositorySupport<Role, Long> implem
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean exists(Long id) {
|
public boolean exists(Long id) {
|
||||||
return queryExists("SELECT EXISTS (SELECT 1 FROM sys_role WHERE id = :id AND deleted = 0 LIMIT 1)",
|
return queryForBool("SELECT EXISTS (SELECT 1 FROM sys_role WHERE id = :id AND deleted = 0 LIMIT 1)",
|
||||||
"id", id);
|
"id", id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -135,7 +135,7 @@ public class RoleRepositoryImpl extends JdbcRepositorySupport<Role, Long> implem
|
|||||||
.addValue("id", id)
|
.addValue("id", id)
|
||||||
.addValue("name", entity.getName())
|
.addValue("name", entity.getName())
|
||||||
.addValue("identifier", entity.getIdentifier())
|
.addValue("identifier", entity.getIdentifier())
|
||||||
.addValue("status", entity.getStatus().getValue())
|
.addValue("status", entity.getStatus().getId())
|
||||||
.addValue("remarks", entity.getRemarks())
|
.addValue("remarks", entity.getRemarks())
|
||||||
.addValue("createTime", now)
|
.addValue("createTime", now)
|
||||||
.addValue("createdBy", loginId)
|
.addValue("createdBy", loginId)
|
||||||
|
@@ -7,9 +7,7 @@
|
|||||||
<version>1.0.0-SNAPSHOT</version>
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<groupId>xyz.zhouxy</groupId>
|
|
||||||
<artifactId>plusone-system</artifactId>
|
<artifactId>plusone-system</artifactId>
|
||||||
<version>1.0.0-SNAPSHOT</version>
|
|
||||||
<packaging>pom</packaging>
|
<packaging>pom</packaging>
|
||||||
|
|
||||||
<name>plusone-system</name>
|
<name>plusone-system</name>
|
||||||
@@ -69,6 +67,10 @@
|
|||||||
</dependencyManagement>
|
</dependencyManagement>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>cn.hutool</groupId>
|
||||||
|
<artifactId>hutool-core</artifactId>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.junit.jupiter</groupId>
|
<groupId>org.junit.jupiter</groupId>
|
||||||
<artifactId>junit-jupiter-api</artifactId>
|
<artifactId>junit-jupiter-api</artifactId>
|
||||||
|
30
pom.xml
30
pom.xml
@@ -1,7 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
||||||
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
@@ -26,15 +25,15 @@
|
|||||||
<maven.compiler.source>17</maven.compiler.source>
|
<maven.compiler.source>17</maven.compiler.source>
|
||||||
<maven.compiler.target>17</maven.compiler.target>
|
<maven.compiler.target>17</maven.compiler.target>
|
||||||
|
|
||||||
<spring-boot.version>2.7.8</spring-boot.version>
|
<spring-boot.version>2.7.10</spring-boot.version>
|
||||||
<sa-token.version>1.34.0</sa-token.version>
|
<sa-token.version>1.34.0</sa-token.version>
|
||||||
<hutool.version>5.8.11</hutool.version>
|
<hutool.version>5.8.16</hutool.version>
|
||||||
<mybatis-starter.version>3.0.1</mybatis-starter.version>
|
<mybatis-starter.version>3.0.1</mybatis-starter.version>
|
||||||
<mybatis-plus.version>3.5.3.1</mybatis-plus.version>
|
<mybatis-plus.version>3.5.3.1</mybatis-plus.version>
|
||||||
<commons-io.version>2.11.0</commons-io.version>
|
<commons-io.version>2.11.0</commons-io.version>
|
||||||
<mica.version>2.7.5</mica.version>
|
<mica.version>2.7.5</mica.version>
|
||||||
<mapstruct.version>1.5.3.Final</mapstruct.version>
|
<mapstruct.version>1.5.3.Final</mapstruct.version>
|
||||||
<guava.version>31.1-jre</guava.version>
|
<guava.version>30.1-jre</guava.version>
|
||||||
<commons-lang3.version>3.12.0</commons-lang3.version>
|
<commons-lang3.version>3.12.0</commons-lang3.version>
|
||||||
<commons-collections4.version>4.4</commons-collections4.version>
|
<commons-collections4.version>4.4</commons-collections4.version>
|
||||||
<commons-math3.version>3.6.1</commons-math3.version>
|
<commons-math3.version>3.6.1</commons-math3.version>
|
||||||
@@ -87,26 +86,12 @@
|
|||||||
<version>${mybatis-plus.version}</version>
|
<version>${mybatis-plus.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>cn.hutool</groupId>
|
|
||||||
<artifactId>hutool-all</artifactId>
|
|
||||||
<version>${hutool.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>cn.hutool</groupId>
|
<groupId>cn.hutool</groupId>
|
||||||
<artifactId>hutool-core</artifactId>
|
<artifactId>hutool-core</artifactId>
|
||||||
<version>${hutool.version}</version>
|
<version>${hutool.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>cn.hutool</groupId>
|
|
||||||
<artifactId>hutool-crypto</artifactId>
|
|
||||||
<version>${hutool.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>cn.hutool</groupId>
|
|
||||||
<artifactId>hutool-captcha</artifactId>
|
|
||||||
<version>${hutool.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>commons-io</groupId>
|
<groupId>commons-io</groupId>
|
||||||
<artifactId>commons-io</artifactId>
|
<artifactId>commons-io</artifactId>
|
||||||
@@ -193,9 +178,8 @@
|
|||||||
<artifactId>logback-classic</artifactId>
|
<artifactId>logback-classic</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.google.code.findbugs</groupId>
|
<groupId>com.google.guava</groupId>
|
||||||
<artifactId>jsr305</artifactId>
|
<artifactId>guava</artifactId>
|
||||||
<version>3.0.2</version>
|
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user