|
|
@@ -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
|