Procházet zdrojové kódy

限流和查询调整

liuchengsen před 1 měsícem
rodič
revize
29fe14aa46

+ 6 - 2
backend-java/src/main/java/com/pharmacopoeia/repository/DrugRepository.java

@@ -12,10 +12,14 @@ import java.util.Optional;
 
 public interface DrugRepository extends JpaRepository<Drug, Long> {
     Optional<Drug> findByDrugId(String drugId);
+
+    @Query("SELECT d FROM Drug d WHERE d.isActive = true AND d.category NOT IN ('通则', '凡例与纲要', '凡例')")
     Page<Drug> findByIsActiveTrue(Pageable pageable);
-    Page<Drug> findByCategoryAndIsActiveTrue(String category, Pageable pageable);
 
-    @Query("SELECT d FROM Drug d WHERE d.isActive = true AND (d.name ILIKE %:keyword% OR d.pinyin ILIKE %:keyword%)")
+    @Query("SELECT d FROM Drug d WHERE d.isActive = true AND d.category = :category AND d.category NOT IN ('通则', '凡例与纲要', '凡例')")
+    Page<Drug> findByCategoryAndIsActiveTrue(@Param("category") String category, Pageable pageable);
+
+    @Query("SELECT d FROM Drug d WHERE d.isActive = true AND d.category NOT IN ('通则', '凡例与纲要', '凡例') AND (d.name ILIKE %:keyword% OR d.pinyin ILIKE %:keyword%)")
     Page<Drug> searchByKeyword(@Param("keyword") String keyword, Pageable pageable);
 
     @Query("SELECT DISTINCT d.category FROM Drug d WHERE d.category IS NOT NULL ORDER BY d.category")

+ 17 - 14
backend-java/src/main/java/com/pharmacopoeia/security/RateLimitFilter.java

@@ -40,22 +40,23 @@ public class RateLimitFilter extends OncePerRequestFilter {
             currentDate = today;
         }
 
-        // 每 IP 每分钟限制(事前检查,防刷)
         String ip = request.getRemoteAddr();
-        var ipCount = minuteCounter.computeIfAbsent(ip, k -> new AtomicInteger(0));
-        if (ipCount.incrementAndGet() > props.getPerMinute()) {
-            response.setStatus(429);
-            response.setContentType("application/json;charset=UTF-8");
-            response.getWriter().write("{\"error\":\"请求过于频繁,请稍后再试\",\"code\":429}");
-            return;
-        }
-
-        // 每日限制:先检查是否已超,超了直接拒(不浪费 DashScope API)
         boolean isChatApi = request.getRequestURI().contains("/chat/")
                 && request.getMethod().equalsIgnoreCase("POST");
-        String userId = null;
+
+        // 仅 chat 接口走限流,药品库等接口跳过
         if (isChatApi) {
-            userId = getUserId(request);
+            // 每 IP 每分钟限制
+            var ipCount = minuteCounter.computeIfAbsent(ip, k -> new AtomicInteger(0));
+            if (ipCount.incrementAndGet() > props.getPerMinute()) {
+                response.setStatus(429);
+                response.setContentType("application/json;charset=UTF-8");
+                response.getWriter().write("{\"error\":\"请求过于频繁,请稍后再试\",\"code\":429}");
+                return;
+            }
+
+            // 每日限制
+            String userId = getUserId(request);
             if (userId == null) userId = "ip:" + ip;
             var dailyCount = dailyCounter.computeIfAbsent(userId, k -> new AtomicInteger(0));
             if (dailyCount.get() >= props.getPerDay()) {
@@ -76,7 +77,9 @@ public class RateLimitFilter extends OncePerRequestFilter {
         filterChain.doFilter(request, statusWrapper);
 
         // 只有成功响应(2xx)才计入每日次数
-        if (isChatApi && userId != null) {
+        if (isChatApi) {
+            String userId = getUserId(request);
+            if (userId == null) userId = "ip:" + ip;
             int status = statusWrapper.getStatus();
             if (status >= 200 && status < 300) {
                 dailyCounter.computeIfAbsent(userId, k -> new AtomicInteger(0)).incrementAndGet();
@@ -96,4 +99,4 @@ public class RateLimitFilter extends OncePerRequestFilter {
         }
         return null;
     }
-}
+}

+ 0 - 1
backend-java/src/main/java/com/pharmacopoeia/service/DrugService.java

@@ -49,7 +49,6 @@ public class DrugService {
                         : drugRepository.findByIsActiveTrue(pageable);
 
         var items = result.getContent().stream()
-                .filter(d -> !"通则".equals(d.getCategory()) && !"凡例与纲要".equals(d.getCategory()))
                 .map(d -> {
                     Map<String, Object> m = new java.util.LinkedHashMap<>();
                     m.put("drug_id", d.getDrugId());

+ 6 - 1
static/index.html

@@ -548,7 +548,12 @@ window.switchTab=function(tab){
   document.getElementById('tabDrugs').classList.toggle('hidden',tab!=='drugs');
   if(tab==='drugs'){drugKeyword='';drugPage=1;document.getElementById('drugList').innerHTML='<div class="welcome"><div class="icon">⏳</div><p>加载中...</p></div>';document.getElementById('drugPager').innerHTML='';loadDrugList(1)}
 };
-loadDrugList();
+// 初始化:打开本地数据库 → 恢复对话 → 预加载药品列表
+	(async function init(){
+	  await openChatDB();
+	  await restoreChat();
+	  loadDrugList();
+	})();
 </script>
 </body>
 </html>