1、结构调整

2、抽象工厂优化
This commit is contained in:
2026-03-31 19:35:21 +08:00
parent 87757b352c
commit ebdbdbeb41
667 changed files with 1240 additions and 50173 deletions

View File

@@ -2,12 +2,13 @@
<project xmlns="http://maven.apache.org/POM/4.0.0"
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">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.njcn</groupId>
<artifactId>msgpush-framework</artifactId>
<version>${revision}</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>msgpush-spring-boot-starter-protection</artifactId>
<packaging>jar</packaging>
@@ -43,5 +44,4 @@
<scope>test</scope>
</dependency>
</dependencies>
</project>
</project>

View File

@@ -1,13 +1,13 @@
package com.njcn.msgpush.framework.idempotent.config;
import com.njcn.msgpush.framework.idempotent.core.aop.IdempotentAspect;
import com.njcn.msgpush.framework.idempotent.core.keyresolver.IdempotentKeyResolver;
import com.njcn.msgpush.framework.idempotent.core.keyresolver.impl.DefaultIdempotentKeyResolver;
import com.njcn.msgpush.framework.idempotent.core.keyresolver.impl.ExpressionIdempotentKeyResolver;
import com.njcn.msgpush.framework.idempotent.core.keyresolver.IdempotentKeyResolver;
import com.njcn.msgpush.framework.idempotent.core.keyresolver.impl.UserIdempotentKeyResolver;
import com.njcn.msgpush.framework.idempotent.core.redis.IdempotentRedisDAO;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import com.njcn.msgpush.framework.redis.config.MsgpushRedisAutoConfiguration;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.core.StringRedisTemplate;

View File

@@ -1,7 +1,7 @@
package com.njcn.msgpush.framework.idempotent.core.annotation;
import com.njcn.msgpush.framework.idempotent.core.keyresolver.impl.DefaultIdempotentKeyResolver;
import com.njcn.msgpush.framework.idempotent.core.keyresolver.IdempotentKeyResolver;
import com.njcn.msgpush.framework.idempotent.core.keyresolver.impl.DefaultIdempotentKeyResolver;
import com.njcn.msgpush.framework.idempotent.core.keyresolver.impl.ExpressionIdempotentKeyResolver;
import com.njcn.msgpush.framework.idempotent.core.keyresolver.impl.UserIdempotentKeyResolver;

View File

@@ -1,7 +1,7 @@
package com.njcn.msgpush.framework.lock4j.config;
import com.njcn.msgpush.framework.lock4j.core.DefaultLockFailureStrategy;
import com.baomidou.lock.spring.boot.autoconfigure.LockAutoConfiguration;
import com.njcn.msgpush.framework.lock4j.core.DefaultLockFailureStrategy;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;

View File

@@ -1,8 +1,8 @@
package com.njcn.msgpush.framework.lock4j.core;
import com.baomidou.lock.LockFailureStrategy;
import com.njcn.msgpush.framework.common.exception.ServiceException;
import com.njcn.msgpush.framework.common.exception.enums.GlobalErrorCodeConstants;
import com.baomidou.lock.LockFailureStrategy;
import lombok.extern.slf4j.Slf4j;
import java.lang.reflect.Method;

View File

@@ -1,7 +1,10 @@
package com.njcn.msgpush.framework.ratelimiter.core.redis;
import lombok.AllArgsConstructor;
import org.redisson.api.*;
import org.redisson.api.RRateLimiter;
import org.redisson.api.RateLimiterConfig;
import org.redisson.api.RateType;
import org.redisson.api.RedissonClient;
import java.time.Duration;
import java.util.Objects;

View File

@@ -1,74 +0,0 @@
package com.njcn.msgpush.framework.signature.core;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.crypto.digest.DigestUtil;
import com.njcn.msgpush.framework.signature.core.annotation.ApiSignature;
import com.njcn.msgpush.framework.signature.core.aop.ApiSignatureAspect;
import com.njcn.msgpush.framework.signature.core.redis.ApiSignatureRedisDAO;
import jakarta.servlet.http.HttpServletRequest;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.StringReader;
import java.util.concurrent.TimeUnit;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.*;
/**
* {@link ApiSignatureTest} 的单元测试
*/
@ExtendWith(MockitoExtension.class)
public class ApiSignatureTest {
@InjectMocks
private ApiSignatureAspect apiSignatureAspect;
@Mock
private ApiSignatureRedisDAO signatureRedisDAO;
@Test
public void testSignatureGet() throws IOException {
// 搞一个签名
Long timestamp = System.currentTimeMillis();
String nonce = IdUtil.randomUUID();
String appId = "xxxxxx";
String appSecret = "yyyyyy";
String signString = "k1=v1&v1=k1testappId=xxxxxx&nonce=" + nonce + "&timestamp=" + timestamp + "yyyyyy";
String sign = DigestUtil.sha256Hex(signString);
// 准备参数
ApiSignature apiSignature = mock(ApiSignature.class);
when(apiSignature.appId()).thenReturn("appId");
when(apiSignature.timestamp()).thenReturn("timestamp");
when(apiSignature.nonce()).thenReturn("nonce");
when(apiSignature.sign()).thenReturn("sign");
when(apiSignature.timeout()).thenReturn(60);
when(apiSignature.timeUnit()).thenReturn(TimeUnit.SECONDS);
HttpServletRequest request = mock(HttpServletRequest.class);
when(request.getHeader(eq("appId"))).thenReturn(appId);
when(request.getHeader(eq("timestamp"))).thenReturn(String.valueOf(timestamp));
when(request.getHeader(eq("nonce"))).thenReturn(nonce);
when(request.getHeader(eq("sign"))).thenReturn(sign);
when(request.getParameterMap()).thenReturn(MapUtil.<String, String[]>builder()
.put("v1", new String[]{"k1"}).put("k1", new String[]{"v1"}).build());
when(request.getContentType()).thenReturn("application/json");
when(request.getReader()).thenReturn(new BufferedReader(new StringReader("test")));
// mock 方法
when(signatureRedisDAO.getAppSecret(eq(appId))).thenReturn(appSecret);
when(signatureRedisDAO.setNonce(eq(appId), eq(nonce), eq(120), eq(TimeUnit.SECONDS))).thenReturn(true);
// 调用
boolean result = apiSignatureAspect.verifySignature(apiSignature, request);
// 断言结果
assertTrue(result);
}
}