commit.
This commit is contained in:
parent
17b5b55d59
commit
4d3d0f7cc7
@ -6,11 +6,9 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
@SpringBootApplication
|
||||
@Slf4j
|
||||
public class PlusoneApplication {
|
||||
|
||||
public static void main(String[] args) {
|
||||
log.debug("Plusone started!");
|
||||
SpringApplication.run(PlusoneApplication.class, args);
|
||||
}
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
package xyz.zhouxy.plusone.system.application.exception;
|
||||
package xyz.zhouxy.plusone.system.application.common.exception;
|
||||
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.web.bind.annotation.ResponseStatus;
|
@ -1,4 +1,4 @@
|
||||
package xyz.zhouxy.plusone.system.application.exception;
|
||||
package xyz.zhouxy.plusone.system.application.common.exception;
|
||||
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.web.bind.annotation.ResponseStatus;
|
@ -1,4 +1,4 @@
|
||||
package xyz.zhouxy.plusone.system.application.exception;
|
||||
package xyz.zhouxy.plusone.system.application.common.exception;
|
||||
|
||||
import xyz.zhouxy.plusone.validator.InvalidInputException;
|
||||
|
@ -1,24 +1,22 @@
|
||||
package xyz.zhouxy.plusone.system.application.exception.handler;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
package xyz.zhouxy.plusone.system.application.common.exception.handler;
|
||||
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.ExceptionHandler;
|
||||
import org.springframework.web.bind.annotation.RestControllerAdvice;
|
||||
|
||||
import xyz.zhouxy.plusone.system.application.exception.AccountLoginException;
|
||||
import xyz.zhouxy.plusone.commons.exception.handler.BaseExceptionHandler;
|
||||
import xyz.zhouxy.plusone.commons.util.RestfulResult;
|
||||
import xyz.zhouxy.plusone.system.application.common.exception.AccountLoginException;
|
||||
|
||||
@RestControllerAdvice
|
||||
public class AccountLoginExceptionHandler extends BaseExceptionHandler {
|
||||
|
||||
public AccountLoginExceptionHandler(@Nonnull ExceptionInfoHolder exceptionInfoHolder) {
|
||||
public AccountLoginExceptionHandler(ExceptionInfoHolder exceptionInfoHolder) {
|
||||
super(exceptionInfoHolder);
|
||||
}
|
||||
|
||||
@ExceptionHandler({ AccountLoginException.class })
|
||||
public ResponseEntity<RestfulResult> handleException(@Nonnull Exception e) {
|
||||
public ResponseEntity<RestfulResult> handleException(Exception e) {
|
||||
return buildExceptionResponse(e);
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
package xyz.zhouxy.plusone.system.application.exception.handler;
|
||||
package xyz.zhouxy.plusone.system.application.common.exception.handler;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
@ -0,0 +1,138 @@
|
||||
package xyz.zhouxy.plusone.system.application.common.model;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.OptionalInt;
|
||||
import java.util.OptionalLong;
|
||||
import java.util.OptionalDouble;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import xyz.zhouxy.plusone.exception.BizException;
|
||||
|
||||
public class AuthenticationInfo<T> {
|
||||
|
||||
/** token 值 */
|
||||
private final String token;
|
||||
|
||||
/** 此 token 对应的LoginId,未登录时不会构建此类的实例 */
|
||||
private final T loginId;
|
||||
|
||||
/** 账号类型 */
|
||||
private final String loginType;
|
||||
|
||||
/** 登录设备类型 */
|
||||
private final String deviceType;
|
||||
|
||||
/** 自定义数据 */
|
||||
@Nonnull
|
||||
private final Map<String, Object> metadata;
|
||||
|
||||
private AuthenticationInfo(String token, T loginId, String loginType, String deviceType,
|
||||
@Nonnull Map<String, Object> metadata) {
|
||||
this.token = token;
|
||||
this.loginId = loginId;
|
||||
this.loginType = loginType;
|
||||
this.deviceType = deviceType;
|
||||
this.metadata = metadata;
|
||||
}
|
||||
|
||||
public String getToken() {
|
||||
return token;
|
||||
}
|
||||
|
||||
public T getLoginId() {
|
||||
return loginId;
|
||||
}
|
||||
|
||||
public String getLoginType() {
|
||||
return loginType;
|
||||
}
|
||||
|
||||
public String getDeviceType() {
|
||||
return deviceType;
|
||||
}
|
||||
|
||||
private Object getObjFromMetadata(String key) {
|
||||
if (this.metadata.containsKey(key)) {
|
||||
return this.metadata.get(key);
|
||||
}
|
||||
throw new BizException(String.format("不存在 key 为 \"%s\"的元数据。", key));
|
||||
}
|
||||
|
||||
public OptionalDouble getMetadataAsDouble(String key) {
|
||||
Object valObj = getObjFromMetadata(key);
|
||||
if (valObj instanceof Double val) {
|
||||
return OptionalDouble.of(val.doubleValue());
|
||||
}
|
||||
return OptionalDouble.empty();
|
||||
}
|
||||
|
||||
public OptionalLong getMetadataAsLong(String key) {
|
||||
Object valObj = getObjFromMetadata(key);
|
||||
if (valObj instanceof Long val) {
|
||||
return OptionalLong.of(val.longValue());
|
||||
}
|
||||
return OptionalLong.empty();
|
||||
}
|
||||
|
||||
public OptionalInt getMetadataAsInt(String key) {
|
||||
Object valObj = getObjFromMetadata(key);
|
||||
if (valObj instanceof Integer val) {
|
||||
return OptionalInt.of(val.intValue());
|
||||
}
|
||||
return OptionalInt.empty();
|
||||
}
|
||||
|
||||
public Optional<String> getMetadataAsString(String key) {
|
||||
Object valObj = getObjFromMetadata(key);
|
||||
if (valObj instanceof String val) {
|
||||
return Optional.of(val);
|
||||
}
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public <C> Optional<C> getMetadata(String key, Class<C> type) {
|
||||
Object valObj = getObjFromMetadata(key);
|
||||
if (valObj == null || !type.isAssignableFrom(valObj.getClass())) {
|
||||
return Optional.empty();
|
||||
}
|
||||
return Optional.of((C) valObj);
|
||||
}
|
||||
|
||||
// ==========================================
|
||||
// builder
|
||||
|
||||
public static <T> Builder<T> builder(String token, T loginId, String loginType, String deviceType) {
|
||||
return new Builder<>(token, loginId, loginType, deviceType);
|
||||
}
|
||||
|
||||
public static final class Builder<T> {
|
||||
private final String token;
|
||||
private final T loginId;
|
||||
private final String loginType;
|
||||
private final String deviceType;
|
||||
|
||||
@Nonnull
|
||||
private final Map<String, Object> meta = new ConcurrentHashMap<>();
|
||||
|
||||
private Builder(String token, T loginId, String loginType, String deviceType) {
|
||||
this.token = token;
|
||||
this.loginId = loginId;
|
||||
this.loginType = loginType;
|
||||
this.deviceType = deviceType;
|
||||
}
|
||||
|
||||
public <C> Builder<T> putMetadata(String key, @Nullable C value) {
|
||||
this.meta.put(key, value);
|
||||
return this;
|
||||
}
|
||||
|
||||
public AuthenticationInfo<T> build() {
|
||||
return new AuthenticationInfo<>(token, loginId, loginType, deviceType, meta);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
package xyz.zhouxy.plusone.system.application.common.model;
|
||||
|
||||
public class PlusoneContext {
|
||||
private static final ThreadLocal<AuthenticationInfo<Long>> context = new ThreadLocal<>();
|
||||
|
||||
public static void setContext(AuthenticationInfo<Long> value) {
|
||||
context.set(value);
|
||||
}
|
||||
|
||||
public static AuthenticationInfo<Long> getContext() {
|
||||
return context.get();
|
||||
}
|
||||
|
||||
public static void remove() {
|
||||
context.remove();
|
||||
}
|
||||
|
||||
private PlusoneContext() {
|
||||
throw new IllegalStateException("Utility class");
|
||||
}
|
||||
}
|
@ -8,9 +8,9 @@ import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import cn.dev33.satoken.stp.StpLogic;
|
||||
import xyz.zhouxy.plusone.system.application.common.exception.AccountLoginException;
|
||||
import xyz.zhouxy.plusone.system.application.common.exception.UnsupportedPrincipalTypeException;
|
||||
import xyz.zhouxy.plusone.system.application.common.util.PrincipalUtil;
|
||||
import xyz.zhouxy.plusone.system.application.exception.AccountLoginException;
|
||||
import xyz.zhouxy.plusone.system.application.query.AccountQueries;
|
||||
import xyz.zhouxy.plusone.system.application.query.result.AccountDetails;
|
||||
import xyz.zhouxy.plusone.system.application.query.result.MenuViewObject;
|
||||
|
@ -16,7 +16,7 @@ import org.springframework.web.bind.annotation.PathVariable;
|
||||
|
||||
import xyz.zhouxy.plusone.commons.util.PageDTO;
|
||||
import xyz.zhouxy.plusone.exception.DataNotExistException;
|
||||
import xyz.zhouxy.plusone.system.application.exception.AccountRegisterException;
|
||||
import xyz.zhouxy.plusone.system.application.common.exception.AccountRegisterException;
|
||||
import xyz.zhouxy.plusone.system.application.query.AccountQueries;
|
||||
import xyz.zhouxy.plusone.system.application.query.params.AccountQueryParams;
|
||||
import xyz.zhouxy.plusone.system.application.query.result.AccountDetails;
|
||||
@ -94,7 +94,6 @@ public class AccountManagementService {
|
||||
Account account = accountRepository.find(id)
|
||||
.orElseThrow(() -> new DataNotExistException("该账号不存在"));
|
||||
account.setAccountInfo(command.getNickname(), command.getAvatar(), Sex.of(command.getSex()));
|
||||
account.setUpdatedBy(adminAuthLogic.getLoginIdAsLong());
|
||||
accountRepository.save(account);
|
||||
}
|
||||
|
||||
|
@ -6,10 +6,10 @@ import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import cn.hutool.core.lang.Assert;
|
||||
import xyz.zhouxy.plusone.system.application.common.exception.AccountLoginException;
|
||||
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.PrincipalUtil;
|
||||
import xyz.zhouxy.plusone.system.application.exception.AccountLoginException;
|
||||
import xyz.zhouxy.plusone.system.application.query.AccountQueries;
|
||||
import xyz.zhouxy.plusone.system.application.query.result.LoginInfoViewObject;
|
||||
import xyz.zhouxy.plusone.system.application.service.command.LoginByOtpCommand;
|
||||
|
@ -9,8 +9,8 @@ import org.springframework.util.Assert;
|
||||
import cn.hutool.core.util.RandomUtil;
|
||||
import xyz.zhouxy.plusone.mail.MailService;
|
||||
import xyz.zhouxy.plusone.sms.SmsService;
|
||||
import xyz.zhouxy.plusone.system.application.exception.AccountLoginException;
|
||||
import xyz.zhouxy.plusone.system.application.exception.AccountRegisterException;
|
||||
import xyz.zhouxy.plusone.system.application.common.exception.AccountLoginException;
|
||||
import xyz.zhouxy.plusone.system.application.common.exception.AccountRegisterException;
|
||||
import xyz.zhouxy.plusone.system.domain.model.account.AccountRepository;
|
||||
import xyz.zhouxy.plusone.system.domain.model.account.Email;
|
||||
import xyz.zhouxy.plusone.system.domain.model.account.MobilePhone;
|
||||
|
@ -16,7 +16,7 @@ import org.springframework.util.Assert;
|
||||
import xyz.zhouxy.plusone.constant.EntityStatus;
|
||||
import xyz.zhouxy.plusone.domain.IWithOrderNumber;
|
||||
import xyz.zhouxy.plusone.exception.DataNotExistException;
|
||||
import xyz.zhouxy.plusone.system.application.exception.UnsupportedMenuTypeException;
|
||||
import xyz.zhouxy.plusone.system.application.common.exception.UnsupportedMenuTypeException;
|
||||
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.UpdateMenuCommand;
|
||||
|
@ -5,10 +5,10 @@ import java.util.Set;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import xyz.zhouxy.plusone.system.application.common.exception.AccountRegisterException;
|
||||
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.PrincipalUtil;
|
||||
import xyz.zhouxy.plusone.system.application.exception.AccountRegisterException;
|
||||
import xyz.zhouxy.plusone.system.application.service.command.RegisterAccountCommand;
|
||||
import xyz.zhouxy.plusone.system.domain.model.account.Account;
|
||||
import xyz.zhouxy.plusone.system.domain.model.account.AccountInfo;
|
||||
|
@ -0,0 +1,20 @@
|
||||
package xyz.zhouxy.plusone.system.application.web.config;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.web.servlet.HandlerInterceptor;
|
||||
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
|
||||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
||||
|
||||
@Configuration
|
||||
public class InterceptorConfig implements WebMvcConfigurer {
|
||||
@Autowired
|
||||
HandlerInterceptor[] interceptors;
|
||||
|
||||
@Override
|
||||
public void addInterceptors(InterceptorRegistry registry) {
|
||||
for (var interceptor : interceptors) {
|
||||
registry.addInterceptor(interceptor);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
package xyz.zhouxy.plusone.system.application.controller;
|
||||
package xyz.zhouxy.plusone.system.application.web.controller;
|
||||
|
||||
import static xyz.zhouxy.plusone.system.constant.AuthLogic.adminAuthLogic;
|
||||
|
@ -1,4 +1,4 @@
|
||||
package xyz.zhouxy.plusone.system.application.controller;
|
||||
package xyz.zhouxy.plusone.system.application.web.controller;
|
||||
|
||||
import static xyz.zhouxy.plusone.system.constant.AuthLogic.adminAuthLogic;
|
||||
import static xyz.zhouxy.plusone.commons.util.RestfulResult.success;
|
@ -1,4 +1,4 @@
|
||||
package xyz.zhouxy.plusone.system.application.controller;
|
||||
package xyz.zhouxy.plusone.system.application.web.controller;
|
||||
|
||||
import static xyz.zhouxy.plusone.commons.util.RestfulResult.success;
|
||||
|
@ -1,4 +1,4 @@
|
||||
package xyz.zhouxy.plusone.system.application.controller;
|
||||
package xyz.zhouxy.plusone.system.application.web.controller;
|
||||
|
||||
import static xyz.zhouxy.plusone.system.constant.AuthLogic.adminAuthLogic;
|
||||
import static xyz.zhouxy.plusone.commons.util.RestfulResult.success;
|
@ -1,4 +1,4 @@
|
||||
package xyz.zhouxy.plusone.system.application.controller;
|
||||
package xyz.zhouxy.plusone.system.application.web.controller;
|
||||
|
||||
import static xyz.zhouxy.plusone.system.constant.AuthLogic.adminAuthLogic;
|
||||
import static xyz.zhouxy.plusone.commons.util.RestfulResult.success;
|
@ -1,4 +1,4 @@
|
||||
package xyz.zhouxy.plusone.system.application.controller;
|
||||
package xyz.zhouxy.plusone.system.application.web.controller;
|
||||
|
||||
import static xyz.zhouxy.plusone.commons.util.RestfulResult.success;
|
||||
|
@ -1,4 +1,4 @@
|
||||
package xyz.zhouxy.plusone.system.application.controller;
|
||||
package xyz.zhouxy.plusone.system.application.web.controller;
|
||||
|
||||
import javax.validation.Valid;
|
||||
import static xyz.zhouxy.plusone.system.constant.AuthLogic.adminAuthLogic;
|
@ -0,0 +1,32 @@
|
||||
package xyz.zhouxy.plusone.system.application.web.interceptor;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import org.springframework.core.annotation.Order;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.web.servlet.HandlerInterceptor;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import xyz.zhouxy.plusone.system.application.common.model.PlusoneContext;
|
||||
import static xyz.zhouxy.plusone.system.constant.AuthLogic.adminAuthLogic;;
|
||||
|
||||
@Slf4j
|
||||
@Order(1)
|
||||
@Component
|
||||
public class HttpContextInterceptor implements HandlerInterceptor {
|
||||
|
||||
@Override
|
||||
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
|
||||
throws Exception {
|
||||
log.info("" + adminAuthLogic.isLogin());
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
|
||||
throws Exception {
|
||||
PlusoneContext.remove();
|
||||
log.info("拦截器清理 ThreadLocal,防止内存泄漏");
|
||||
}
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
/**
|
||||
* 拦截器
|
||||
*
|
||||
* @author <a href="https://gitee.com/zhouxy108">ZhouXY</a>
|
||||
* @since 1.0
|
||||
*/
|
||||
package xyz.zhouxy.plusone.system.application.web.interceptor;
|
@ -269,10 +269,6 @@ public class Account extends AggregateRoot<Long> implements IWithVersion {
|
||||
return Optional.ofNullable(updatedBy);
|
||||
}
|
||||
|
||||
public void setUpdatedBy(long updatedBy) {
|
||||
this.updatedBy = updatedBy;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getVersion() {
|
||||
return this.version;
|
||||
|
Loading…
x
Reference in New Issue
Block a user