From b4b626357b61d5297b90e3f656be8ef7ad90ddeb Mon Sep 17 00:00:00 2001
From: rk <94314517@qq.com>
Date: 星期一, 22 六月 2026 14:28:09 +0800
Subject: [PATCH] 遗漏提交

---
 server/web/src/main/java/com/doumee/api/Repeat/RepeatSubmitAspect.java |   74 +++++++++++++++++++++++++++++++++++++
 server/web/src/main/java/com/doumee/api/Repeat/RepeatSubmit.java       |   28 ++++++++++++++
 2 files changed, 102 insertions(+), 0 deletions(-)

diff --git a/server/web/src/main/java/com/doumee/api/Repeat/RepeatSubmit.java b/server/web/src/main/java/com/doumee/api/Repeat/RepeatSubmit.java
new file mode 100644
index 0000000..5f8a2cc
--- /dev/null
+++ b/server/web/src/main/java/com/doumee/api/Repeat/RepeatSubmit.java
@@ -0,0 +1,28 @@
+package com.doumee.api.Repeat;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+// @Target 琛ㄧず璇ユ敞瑙g敤浜庝粈涔堝湴鏂�
+// ElementType.CONSTRUCTOR 鐢ㄥ湪鏋勯�犲櫒
+// ElementType.FIELD 鐢ㄤ簬鎻忚堪鍩�-灞炴�т笂
+// ElementType.METHOD 鐢ㄥ湪鏂规硶涓�
+// ElementType.TYPE 鐢ㄥ湪绫绘垨鎺ュ彛涓�
+// ElementType.PACKAGE 鐢ㄤ簬鎻忚堪鍖�
+@Target({ElementType.ANNOTATION_TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE})
+
+//@Retention 琛ㄧず鍦ㄤ粈涔堢骇鍒繚瀛樿娉ㄨВ淇℃伅
+// RetentionPolicy.SOURCE 淇濈暀鍒版簮鐮佷笂
+// RetentionPolicy.CLASS 淇濈暀鍒板瓧鑺傜爜涓�
+// RetentionPolicy.RUNTIME 淇濈暀鍒拌櫄鎷熸満杩愯鏃讹紙鏈�澶氾紝鍙�氳繃鍙嶅皠鑾峰彇锛�
+@Retention(RetentionPolicy.RUNTIME)
+public @interface RepeatSubmit {
+
+    /**
+     * 榛樿鐨勯棿闅旀椂闂�(ms)锛屽皬浜庢鏃堕棿瑙嗕负閲嶅鎻愪氦
+     */
+    int timeout() default 2000;
+
+}
\ No newline at end of file
diff --git a/server/web/src/main/java/com/doumee/api/Repeat/RepeatSubmitAspect.java b/server/web/src/main/java/com/doumee/api/Repeat/RepeatSubmitAspect.java
new file mode 100644
index 0000000..591aef4
--- /dev/null
+++ b/server/web/src/main/java/com/doumee/api/Repeat/RepeatSubmitAspect.java
@@ -0,0 +1,74 @@
+package com.doumee.api.Repeat;
+
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.lang.reflect.Method;
+import java.util.concurrent.TimeUnit;
+
+// 寮�鍚棩蹇楋紝闇�瑕佷緷璧杔ombok
+@Slf4j
+// 鎶婁竴涓被瀹氫箟涓哄垏闈緵瀹瑰櫒璇诲彇
+@Aspect
+@Component
+public class RepeatSubmitAspect {
+
+    @Resource
+    private RedisTemplate<String, String> redisTemplate;
+
+    // 杩欐槸涓�涓幆缁曢�氱煡锛屽畠浼氬洿缁曡 @RepeatSubmit 娉ㄨВ鏍囪鐨勬柟娉曟墽琛�,杩欓噷鐨� repeatSubmit 涓庝笅闈㈢殑鍙傛暟瀵瑰簲
+    @Around("@annotation(repeatSubmit)")
+    public Object around(ProceedingJoinPoint point, RepeatSubmit repeatSubmit) throws Throwable {
+
+        // 鑾峰彇鐢ㄦ埛鐨則oken楠岃瘉,杩欓噷椤圭洰鐢ㄧ殑鏄� header 閲岀殑 Authorization 鍙傛暟
+        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
+        String requestToken = request.getHeader("token");
+
+        // 鑾峰彇娉ㄨВ
+        MethodSignature signature = (MethodSignature) point.getSignature();
+        Method method = signature.getMethod();
+
+        // 鑾峰彇绫伙紝鏂规硶
+        String className = method.getDeclaringClass().getName();
+        String methodName = method.getName();
+
+        // 缁勮key锛氱敤鎴峰敮涓�鏍囪瘑+鎿嶄綔绫�+鏂规硶
+        String key = requestToken + "#" + className + "#" + methodName;
+        String keyHashCode = String.valueOf(Math.abs(key.hashCode()));
+        log.info("key:{},keyHashcode:{}", key, keyHashCode);
+
+        //鑾峰彇瓒呮椂鏃堕棿
+        int timeOut = repeatSubmit.timeout();
+        log.info("瓒呮椂鏃堕棿{}", timeOut);
+
+        // 浠庣紦瀛樼粰涓牴鎹甼ey鑾峰彇鏁版嵁
+        String value = redisTemplate.opsForValue().get(keyHashCode);
+
+        if (value != null) {
+            log.info("閲嶅鎻愪氦");
+            // 濡傛灉value涓嶄负绌�; return "璇峰嬁閲嶅鎻愪氦";
+            throw new BusinessException(ResponseStatus.MASSIVE_REQUEST);
+
+        } else {
+            log.info("棣栨鎻愪氦");
+            // value涓虹┖锛屽垯鍔犲叆缂撳瓨锛屽苟璁剧疆杩囨湡杩囨湡鏃堕棿
+            redisTemplate.opsForValue().set(keyHashCode, "1", timeOut, TimeUnit.MILLISECONDS);
+        }
+
+        //鎵цObject
+        Object object = point.proceed();
+
+        return object;
+    }
+}
\ No newline at end of file

--
Gitblit v1.9.3