Files
ChouJuGEO/modules/ui/tab_resources.py
T

173 lines
7.1 KiB
Python
Raw Normal View History

# Tab8GEO 资源库(从 geo_tool.py 迁移,通过 render_tab_resources() 供主入口调用。)
import streamlit as st
from modules.resource_recommender import ResourceRecommender
2026-04-30 23:35:06 +08:00
from modules.ui.components import render_tab_top_with_clear
def render_tab_resources(storage, brand: str) -> None:
"""渲染 Tab8:GEO 资源库。由主入口在 with tab8 内调用。"""
2026-04-30 23:35:06 +08:00
render_tab_top_with_clear(
title="📚 GEO 资源库",
caption="发现 GEO 相关工具、代理、论文和社区资源,增强工具生态",
clear_key="resources_clear",
on_clear=lambda: None, # 资源库无需清空
)
resource_recommender = ResourceRecommender()
# 资源统计概览
summary = resource_recommender.get_resource_summary()
2026-04-30 23:35:06 +08:00
stat_cols = st.columns(5)
stats = [
("总资源数", summary['total']),
("AI 搜索", summary['agents']),
("工具推荐", summary['tools']),
("论文指南", summary['papers']),
("社区资源", summary['communities']),
]
for col, (label, value) in zip(stat_cols, stats):
with col:
st.metric(label, value)
# 搜索功能
2026-04-30 23:35:06 +08:00
search_col1, search_col2 = st.columns([4, 1])
with search_col1:
search_query = st.text_input(
2026-04-30 23:35:06 +08:00
"搜索资源",
key="resource_search",
2026-04-30 23:35:06 +08:00
placeholder="🔍 输入关键词搜索资源名称、描述、功能特性...",
label_visibility="collapsed"
)
with search_col2:
2026-04-30 23:35:06 +08:00
if st.button("清除", use_container_width=True, key="clear_resource_search"):
st.session_state.resource_search = ""
st.rerun()
# 资源分类标签
2026-04-30 23:35:06 +08:00
resource_tab1, resource_tab2, resource_tab3, resource_tab4 = st.tabs([
"🤖 AI 搜索", "🛠️ 工具推荐", "📄 论文指南", "👥 社区资源"
])
2026-04-30 23:35:06 +08:00
# AI 搜索/代理
with resource_tab1:
2026-04-30 23:35:06 +08:00
st.caption("AI 搜索引擎和内容生成服务,用于验证和优化 GEO 效果")
if search_query:
agents = resource_recommender.search_resources(search_query, "agents")
else:
agents = resource_recommender.get_agents()
if agents:
2026-04-30 23:35:06 +08:00
for agent in agents:
with st.container(border=True):
col1, col2 = st.columns([3, 1])
with col1:
2026-04-30 23:35:06 +08:00
st.markdown(f"**{agent['name']}** {agent.get('rating', '')}")
with col2:
if agent.get('url'):
2026-04-30 23:35:06 +08:00
st.link_button("访问", agent['url'], use_container_width=True)
2026-04-30 23:35:06 +08:00
st.caption(agent['description'])
if agent.get('features'):
2026-04-30 23:35:06 +08:00
features_text = " · ".join([f"{f}" for f in agent['features']])
st.markdown(f"<small>{features_text}</small>", unsafe_allow_html=True)
else:
2026-04-30 23:35:06 +08:00
st.info("💡 暂无匹配的资源,尝试其他关键词搜索。")
# 工具推荐
with resource_tab2:
st.caption("GEO 相关的工具和服务,帮助优化内容效果")
if search_query:
tools = resource_recommender.search_resources(search_query, "tools")
else:
tools = resource_recommender.get_tools()
if tools:
# 按分类分组显示
categories = {}
for tool in tools:
cat = tool.get('category', '其他')
if cat not in categories:
categories[cat] = []
categories[cat].append(tool)
for category, category_tools in categories.items():
2026-04-30 23:35:06 +08:00
st.markdown(f"**{category}**")
for tool in category_tools:
with st.container(border=True):
col1, col2 = st.columns([3, 1])
with col1:
st.markdown(f"**{tool['name']}** {tool.get('rating', '')}")
with col2:
if tool.get('url'):
2026-04-30 23:35:06 +08:00
st.link_button("访问", tool['url'], use_container_width=True)
2026-04-30 23:35:06 +08:00
st.caption(tool['description'])
if tool.get('features'):
2026-04-30 23:35:06 +08:00
features_text = " · ".join([f"{f}" for f in tool['features']])
st.markdown(f"<small>{features_text}</small>", unsafe_allow_html=True)
else:
2026-04-30 23:35:06 +08:00
st.info("💡 暂无匹配的工具,尝试其他关键词搜索。")
# 论文/指南
with resource_tab3:
st.caption("GEO 相关的论文、指南、文档,深入学习 GEO 策略")
if search_query:
papers = resource_recommender.search_resources(search_query, "papers")
else:
papers = resource_recommender.get_papers()
if papers:
2026-04-30 23:35:06 +08:00
# 按重要性分组显示
importance_order = {"": 3, "": 2, "": 1}
papers_sorted = sorted(papers, key=lambda x: importance_order.get(x.get('importance', ''), 1), reverse=True)
2026-04-30 23:35:06 +08:00
importance_groups = {
"🔥 必读": [p for p in papers_sorted if p.get('importance') == ''],
"⭐ 推荐": [p for p in papers_sorted if p.get('importance') == ''],
}
2026-04-30 23:35:06 +08:00
for group_name, group_papers in importance_groups.items():
if group_papers:
st.markdown(f"**{group_name}**")
for paper in group_papers:
with st.container(border=True):
st.markdown(f"**{paper['title']}**")
st.caption(paper['description'])
meta = f"分类:{paper.get('category', 'N/A')} · 日期:{paper.get('date', 'N/A')}"
st.markdown(f"<small>{meta}</small>", unsafe_allow_html=True)
if paper.get('url'):
st.link_button("查看", paper['url'], use_container_width=True)
else:
2026-04-30 23:35:06 +08:00
st.info("💡 暂无匹配的论文/指南,尝试其他关键词搜索。")
# 社区资源
with resource_tab4:
st.caption("GEO 相关的社区和论坛,与其他用户交流经验")
if search_query:
communities = resource_recommender.search_resources(search_query, "communities")
else:
communities = resource_recommender.get_communities()
if communities:
2026-04-30 23:35:06 +08:00
for community in communities:
with st.container(border=True):
col1, col2 = st.columns([3, 1])
with col1:
2026-04-30 23:35:06 +08:00
st.markdown(f"**{community['name']}** {community.get('rating', '')}")
with col2:
if community.get('url'):
2026-04-30 23:35:06 +08:00
st.link_button("访问", community['url'], use_container_width=True)
2026-04-30 23:35:06 +08:00
st.caption(community['description'])
st.markdown(f"<small>分类:{community.get('category', 'N/A')}</small>", unsafe_allow_html=True)
else:
2026-04-30 23:35:06 +08:00
st.info("💡 暂无匹配的社区资源,尝试其他关键词搜索。")