Spaces:
Running
on
Zero
Running
on
Zero
import gradio as gr | |
import traceback | |
from typing import Optional, Dict, List | |
from history_manager import UserHistoryManager | |
class SearchHistoryComponent: | |
def __init__(self): | |
"""初始化搜索歷史組件""" | |
self.history_manager = UserHistoryManager() | |
def format_history_html(self, history_data: Optional[List[Dict]] = None) -> str: | |
"""將歷史記錄格式化為HTML""" | |
try: | |
if history_data is None: | |
history_data = self.history_manager.get_history() | |
if not history_data: | |
return """ | |
<div style='text-align: center; padding: 20px; color: #666;'> | |
No search history yet. Try making some breed recommendations! | |
</div> | |
""" | |
html = "<div class='history-container'>" | |
for entry in reversed(history_data): | |
timestamp = entry.get('timestamp', 'Unknown time') | |
prefs = entry.get('preferences', {}) | |
results = entry.get('results', []) | |
html += f""" | |
<div class="history-entry"> | |
<div class="history-header"> | |
<span class="timestamp">🕒 {timestamp}</span> | |
</div> | |
<div class="params-list"> | |
<h4>Search Parameters:</h4> | |
<ul> | |
<li><span class="param-label">Living Space:</span> {prefs.get('living_space', 'N/A')}</li> | |
<li><span class="param-label">Exercise Time:</span> {prefs.get('exercise_time', 'N/A')} minutes</li> | |
<li><span class="param-label">Grooming:</span> {prefs.get('grooming_commitment', 'N/A')}</li> | |
<li><span class="param-label">Experience:</span> {prefs.get('experience_level', 'N/A')}</li> | |
<li><span class="param-label">Children at Home:</span> {"Yes" if prefs.get('has_children') else "No"}</li> | |
<li><span class="param-label">Noise Tolerance:</span> {prefs.get('noise_tolerance', 'N/A')}</li> | |
</ul> | |
</div> | |
<div class="results-list"> | |
<h4>Top 5 Breed Matches:</h4> | |
<div class="breed-list"> | |
""" | |
if results: | |
for i, result in enumerate(results[:5], 1): | |
breed_name = result.get('breed', 'Unknown breed').replace('_', ' ') | |
score = result.get('overall_score', result.get('final_score', 0)) | |
html += f""" | |
<div class="breed-item"> | |
<div class="breed-info"> | |
<span class="breed-rank">#{i}</span> | |
<span class="breed-name">{breed_name}</span> | |
<span class="breed-score">{score*100:.1f}%</span> | |
</div> | |
</div> | |
""" | |
html += """ | |
</div> | |
</div> | |
</div> | |
""" | |
html += "</div>" | |
return html | |
except Exception as e: | |
print(f"Error formatting history: {str(e)}") | |
print(traceback.format_exc()) | |
return f""" | |
<div style='text-align: center; padding: 20px; color: #dc2626;'> | |
Error formatting history. Please try refreshing the page. | |
<br>Error details: {str(e)} | |
</div> | |
""" | |
def clear_history(self) -> str: | |
"""清除所有搜尋歷史""" | |
try: | |
success = self.history_manager.clear_all_history() | |
print(f"Clear history result: {success}") | |
return self.format_history_html() | |
except Exception as e: | |
print(f"Error in clear_history: {str(e)}") | |
print(traceback.format_exc()) | |
return "Error clearing history" | |
def refresh_history(self) -> str: | |
"""刷新歷史記錄顯示""" | |
try: | |
return self.format_history_html() | |
except Exception as e: | |
print(f"Error in refresh_history: {str(e)}") | |
return "Error refreshing history" | |
def save_search(self, user_preferences: dict, results: list) -> bool: | |
"""保存搜索結果""" | |
return self.history_manager.save_history(user_preferences, results) | |
def create_history_component(): | |
"""只创建历史组件实例,不创建UI""" | |
return SearchHistoryComponent() | |
def create_history_tab(history_component: SearchHistoryComponent): | |
"""创建历史记录标签页 | |
Args: | |
history_component: 已创建的历史组件实例 | |
""" | |
with gr.TabItem("Recommendation Search History"): | |
gr.HTML(""" | |
<div style='text-align: center; padding: 20px;'> | |
<h3 style='color: #2D3748; margin-bottom: 10px;'>Search History</h3> | |
<p style='color: #4A5568;'>View your previous breed recommendations and search preferences</p> | |
</div> | |
""") | |
with gr.Row(): | |
with gr.Column(scale=4): | |
history_display = gr.HTML() | |
with gr.Row(): | |
with gr.Column(scale=1): | |
clear_history_btn = gr.Button( | |
"🗑️ Clear History", | |
variant="secondary", | |
size="sm" | |
) | |
with gr.Column(scale=1): | |
refresh_btn = gr.Button( | |
"🔄 Refresh", | |
variant="secondary", | |
size="sm" | |
) | |
history_display.value = history_component.format_history_html() | |
clear_history_btn.click( | |
fn=history_component.clear_history, | |
outputs=[history_display], | |
api_name="clear_history" | |
) | |
refresh_btn.click( | |
fn=history_component.refresh_history, | |
outputs=[history_display], | |
api_name="refresh_history" | |
) | |