import streamlit as st import plotly.graph_objects as go import plotly.express as px import numpy as np from datetime import datetime, timedelta import streamlit as st import pandas as pd from pathlib import Path # تنظیمات صفحه st.set_page_config( page_title="داشبورد مدیریت", page_icon="👤", layout="wide" ) # استایلهای داشبورد st.markdown(""" <style> @import url('https://fonts.googleapis.com/css2?family=Vazirmatn:wght@400;700&display=swap'); * { font-family: 'Vazirmatn', sans-serif; direction: rtl; } .dashboard-container { background: white; border-radius: 15px; padding: 25px; margin: 20px 0; box-shadow: 0 4px 6px rgba(0,0,0,0.1); } .stat-card { background: linear-gradient(135deg, #6B73FF 0%, #000DFF 100%); color: white; padding: 20px; border-radius: 10px; margin: 10px; text-align: center; } .file-upload { border: 2px dashed #ccc; padding: 20px; border-radius: 10px; text-align: center; margin: 20px 0; transition: all 0.3s ease; } .file-upload:hover { border-color: #2196F3; } .action-button { background: #2196F3; color: white; padding: 10px 20px; border: none; border-radius: 5px; cursor: pointer; transition: all 0.3s ease; } .action-button:hover { background: #1976D2; transform: scale(1.05); } .file-list { margin-top: 20px; } .file-item { display: flex; justify-content: space-between; align-items: center; padding: 15px; background: #f5f5f5; border-radius: 8px; margin: 10px 0; } .delete-button { background: #ff4444; color: white; padding: 5px 15px; border: none; border-radius: 5px; cursor: pointer; } .delete-button:hover { background: #cc0000; } </style> """, unsafe_allow_html=True) # هدر داشبورد st.title("🎛️ داشبورد مدیریت") # آمار کلی col1, col2, col3 = st.columns(3) with col1: st.markdown(""" <div class="stat-card"> <h2>۱۲۳</h2> <p>تعداد فایلها</p> </div> """, unsafe_allow_html=True) with col2: st.markdown(""" <div class="stat-card"> <h2>۴۵۶</h2> <p>تعداد پرسشها</p> </div> """, unsafe_allow_html=True) with col3: st.markdown(""" <div class="stat-card"> <h2>۷۸۹</h2> <p>پاسخهای موفق</p> </div> """, unsafe_allow_html=True) # بخش آپلود فایل st.markdown(""" <div class="dashboard-container"> <h3>📤 آپلود فایل جدید</h3> <div class="file-upload"> <p>فایل خود را اینجا رها کنید یا کلیک کنید</p> <input type="file" accept=".csv,.json,.txt"> </div> </div> """, unsafe_allow_html=True) # لیست فایلها st.markdown(""" <div class="dashboard-container"> <h3>📁 مدیریت فایلها</h3> <div class="file-list"> <div class="file-item"> <span>banking_data.csv</span> <button class="delete-button">حذف</button> </div> <div class="file-item"> <span>customer_qa.json</span> <button class="delete-button">حذف</button> </div> <div class="file-item"> <span>training_data.txt</span> <button class="delete-button">حذف</button> </div> </div> </div> """, unsafe_allow_html=True) # تنظیمات مدل st.markdown(""" <div class="dashboard-container"> <h3>⚙️ تنظیمات مدل</h3> <div style="margin: 20px 0;"> <label>دمای مدل:</label> <input type="range" min="0" max="100" value="70"> </div> <div style="margin: 20px 0;"> <label>حداکثر طول پاسخ:</label> <input type="number" value="512"> </div> <button class="action-button">ذخیره تنظیمات</button> </div> """, unsafe_allow_html=True) if __name__ == "__main__": st.markdown(""" <script> // اضافه کردن عملکرد به دکمهها document.querySelectorAll('.delete-button').forEach(button => { button.addEventListener('click', function() { if (confirm('آیا از حذف این فایل اطمینان دارید؟')) { this.closest('.file-item').remove(); } }); }); </script> """, unsafe_allow_html=True) # اضافه کردن بخش نمودارها st.markdown(""" <div class="dashboard-container"> <h3>📊 تحلیل عملکرد مدل</h3> </div> """, unsafe_allow_html=True) # نمودار نرخ یادگیری col1, col2 = st.columns(2) with col1: # نمودار نرخ یادگیری dates = [datetime.now() - timedelta(days=x) for x in range(30)] learning_rate = [0.001 * np.exp(-x/10) for x in range(30)] fig_learning = go.Figure() fig_learning.add_trace(go.Scatter( x=dates, y=learning_rate, mode='lines+markers', name='نرخ یادگیری', line=dict(color='#2196F3', width=3) )) fig_learning.update_layout( title='نرخ یادگیری در طول زمان', xaxis_title='تاریخ', yaxis_title='نرخ یادگیری', template='plotly_white', dir='rtl' ) st.plotly_chart(fig_learning, use_container_width=True) with col2: # نمودار دقت مدل accuracy_data = np.linspace(0.7, 0.95, 30) fig_accuracy = go.Figure() fig_accuracy.add_trace(go.Scatter( x=dates, y=accuracy_data, mode='lines+markers', name='دقت مدل', line=dict(color='#4CAF50', width=3) )) fig_accuracy.update_layout( title='پیشرفت دقت مدل', xaxis_title='تاریخ', yaxis_title='دقت', template='plotly_white', dir='rtl' ) st.plotly_chart(fig_accuracy, use_container_width=True) # نمودار پاسخهای صحیح و غلط labels = ['پاسخهای صحیح', 'پاسخهای غلط'] values = [85, 15] fig_pie = go.Figure(data=[go.Pie( labels=labels, values=values, hole=.3, marker_colors=['#4CAF50', '#f44336'] )]) fig_pie.update_layout(title='نسبت پاسخهای صحیح به غلط') st.plotly_chart(fig_pie, use_container_width=True) # چتبات آموزش سریع st.markdown(""" <div class="dashboard-container"> <h3>🤖 آموزش سریع با چتبات</h3> <div class="chat-trainer"> <input type="text" placeholder="دستور آموزشی خود را وارد کنید..." class="trainer-input"> <button class="action-button">ارسال دستور</button> </div> </div> """, unsafe_allow_html=True) # دکمه دسترسی به نالج بیس st.markdown(""" <div class="dashboard-container"> <h3>📚 مدیریت نالج بیس</h3> <button class="action-button" onclick="window.open('/filemanager.py')"> <i class="fas fa-folder-open"></i> دسترسی به فایل منیجر </button> </div> """, unsafe_allow_html=True) # اضافه کردن استایلهای جدید st.markdown(""" <style> .chat-trainer { display: flex; gap: 10px; margin: 20px 0; } .trainer-input { flex: 1; padding: 12px; border: 2px solid #f0f0f0; border-radius: 8px; font-size: 14px; } .plotly-chart { background: white; border-radius: 10px; padding: 15px; box-shadow: 0 4px 6px rgba(0,0,0,0.1); } </style> """, unsafe_allow_html=True) # اضافه کردن نمودار هیتمپ برای نمایش ماتریس خطا confusion_matrix = np.array([ [850, 50], [30, 70] ]) fig_heatmap = px.imshow( confusion_matrix, labels=dict(x="پیشبینی", y="مقدار واقعی"), x=['مثبت', 'منفی'], y=['مثبت', 'منفی'], color_continuous_scale="RdBu", title="ماتریس خطا" ) fig_heatmap.update_layout( template='plotly_white', dir='rtl', width=600, height=500 ) # نمودار روند زمانی با قابلیت فیلتر training_metrics = pd.DataFrame({ 'تاریخ': pd.date_range(start='2023-01-01', periods=100), 'دقت': np.random.normal(0.85, 0.05, 100).cumsum()/100, 'recall': np.random.normal(0.80, 0.05, 100).cumsum()/100, 'f1_score': np.random.normal(0.82, 0.05, 100).cumsum()/100 }) fig_metrics = px.line( training_metrics, x='تاریخ', y=['دقت', 'recall', 'f1_score'], title='روند معیارهای ارزیابی', labels={'value': 'مقدار', 'variable': 'معیار'}, template='plotly_white' ) fig_metrics.update_layout( showlegend=True, legend_title_text='معیارها', hovermode='x unified', updatemenus=[ dict( buttons=list([ dict( args=[{"visible": [True, True, True]}], label="همه", method="restyle" ), dict( args=[{"visible": [True, False, False]}], label="دقت", method="restyle" ), dict( args=[{"visible": [False, True, False]}], label="Recall", method="restyle" ), dict( args=[{"visible": [False, False, True]}], label="F1 Score", method="restyle" ) ]), direction="down", showactive=True, x=0.1, y=1.1 ) ] ) # نمودار توزیع خطا errors = np.random.normal(0, 1, 1000) fig_dist = px.histogram( errors, nbins=50, title='توزیع خطای پیشبینی', labels={'value': 'خطا', 'count': 'تعداد'}, template='plotly_white' ) fig_dist.update_layout( bargap=0.1, showlegend=False ) # اضافه کردن کنترلهای تعاملی st.sidebar.markdown("## تنظیمات نمودارها") time_range = st.sidebar.slider( "بازه زمانی (روز)", min_value=7, max_value=100, value=30 ) metric_threshold = st.sidebar.number_input( "آستانه دقت", min_value=0.0, max_value=1.0, value=0.8, step=0.05 ) # نمایش نمودارها با چینش جدید col1, col2 = st.columns(2) with col1: st.plotly_chart(fig_metrics, use_container_width=True) st.plotly_chart(fig_heatmap, use_container_width=True) with col2: st.plotly_chart(fig_dist, use_container_width=True) st.plotly_chart(fig_pie, use_container_width=True)