zhangliang há 1 mês atrás
pai
commit
b26ae6205a
1 ficheiros alterados com 63 adições e 11 exclusões
  1. 63 11
      dashboard/app.py

+ 63 - 11
dashboard/app.py

@@ -27,6 +27,14 @@ st.set_page_config(
 )
 
 load_dotenv(os.path.join(os.path.dirname(__file__), '../.env'))
+st.markdown(
+    """
+    <script>
+      document.documentElement.lang = 'zh-CN';
+    </script>
+    """,
+    unsafe_allow_html=True
+)
 
 # ===== 字段映射 =====
 FIELD_MAPPING = {
@@ -100,21 +108,35 @@ def delete_keyword(keyword_id):
         return result.rowcount > 0
 
 
-def fetch_real_time_data(keyword):
+def fetch_real_time_data(keyword, start_date=None, end_date=None):
     """
     实时查询关键词数据
     """
     import httpx
-    from datetime import datetime, timedelta
+    from datetime import datetime, timedelta, date
     from app.core.config import settings
-    
-    end_date = datetime.now()
-    start_date = end_date - timedelta(days=settings.LIMIT_DAY)
+
+    if end_date is None:
+        end_date = datetime.now().date()
+    elif isinstance(end_date, datetime):
+        end_date = end_date.date()
+
+    if start_date is None:
+        start_date = end_date - timedelta(days=settings.LIMIT_DAY)
+    elif isinstance(start_date, datetime):
+        start_date = start_date.date()
+
+    if not isinstance(start_date, date) or not isinstance(end_date, date):
+        return False, "日期参数格式错误"
+    if start_date > end_date:
+        return False, "开始日期不能晚于结束日期"
+    if (end_date - start_date).days > 365:
+        return False, "实时查询时间跨度最多支持一年(365天)"
     
     payload = {
         "keyword": keyword,
-        "start_ymd": str(start_date.strftime("%Y%m%d")),
-        "end_ymd": str(end_date.strftime("%Y%m%d"))
+        "start_ymd": start_date.strftime("%Y%m%d"),
+        "end_ymd": end_date.strftime("%Y%m%d")
     }
     
     try:
@@ -201,10 +223,24 @@ if 'recent_keywords' not in st.session_state:
 
 with st.sidebar.expander("⚡ 实时查询", expanded=True):
     realtime_keyword = st.text_input("输入要实时查询的关键词", placeholder="例如:春节")
+    realtime_date_range = st.date_input(
+        "实时查询日期范围",
+        value=(datetime.now() - timedelta(days=30), datetime.now()),
+        max_value=datetime.now(),
+        key="realtime_date_range",
+        format="YYYY-MM-DD"
+    )
+    st.caption("可直接在日期框内手动输入 YYYY-MM-DD,输入后会与日历自动联动")
     if st.button("实时查询"):
-        if realtime_keyword.strip():
+        if len(realtime_date_range) != 2:
+            st.warning("请选择完整的实时查询日期范围")
+        elif realtime_keyword.strip():
             with st.spinner(f"正在查询 '{realtime_keyword}' 的实时数据..."):
-                success, result = fetch_real_time_data(realtime_keyword.strip())
+                success, result = fetch_real_time_data(
+                    realtime_keyword.strip(),
+                    realtime_date_range[0],
+                    realtime_date_range[1]
+                )
                 if success:
                     # 将实时数据存储到session state
                     st.session_state['realtime_data'] = result
@@ -226,7 +262,14 @@ with st.sidebar.expander("⚡ 实时查询", expanded=True):
         for i, kw in enumerate(st.session_state['recent_keywords'][:5]):
             if st.button(kw, key=f"recent_{i}", help="点击使用此关键词"):
                 # 触发实时查询
-                success, result = fetch_real_time_data(kw)
+                if len(realtime_date_range) != 2:
+                    st.warning("请选择完整的实时查询日期范围")
+                    continue
+                success, result = fetch_real_time_data(
+                    kw,
+                    realtime_date_range[0],
+                    realtime_date_range[1]
+                )
                 if success:
                     st.session_state['realtime_data'] = result
                     st.session_state['realtime_keyword'] = kw
@@ -401,7 +444,16 @@ if final_keywords:
     if custom_keyword:
         # 执行实时查询
         with st.spinner(f"正在实时查询 '{custom_keyword}' 的数据..."):
-            success, result = fetch_real_time_data(custom_keyword)
+            realtime_date_range = st.session_state.get('realtime_date_range', ())
+            if len(realtime_date_range) != 2:
+                st.warning("请选择完整的实时查询日期范围")
+                success, result = False, "实时查询日期范围不完整"
+            else:
+                success, result = fetch_real_time_data(
+                    custom_keyword,
+                    realtime_date_range[0],
+                    realtime_date_range[1]
+                )
             if success:
                 st.subheader(f"⚡ 实时查询结果:{custom_keyword}")
                 df = result