import streamlit as st import sqlite3 import random from datetime import datetime import pandas as pd import plotly.express as px from pathlib import Path # تنظیمات اولیه دیتابیس class DatabaseManager: def __init__(self): self.conn = sqlite3.connect('banking_assistant.db') self.create_tables() def create_tables(self): c = self.conn.cursor() # جدول مکالمات c.execute(''' CREATE TABLE IF NOT EXISTS conversations ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_message TEXT, assistant_response TEXT, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP, feedback INTEGER DEFAULT 0 ) ''') # جدول پایگاه دانش c.execute(''' CREATE TABLE IF NOT EXISTS knowledge_base ( id INTEGER PRIMARY KEY AUTOINCREMENT, question TEXT, answer TEXT, category TEXT, created_at DATETIME DEFAULT CURRENT_TIMESTAMP ) ''') # جدول تنظیمات c.execute(''' CREATE TABLE IF NOT EXISTS settings ( id INTEGER PRIMARY KEY AUTOINCREMENT, theme TEXT DEFAULT 'light', language TEXT DEFAULT 'fa', created_at DATETIME DEFAULT CURRENT_TIMESTAMP ) ''') self.conn.commit() # تنظیمات استایل و تم THEMES = { 'light': { 'bg_color': '#e0e5ec', 'text_color': '#333', 'shadow': '9px 9px 16px #b8b9be, -9px -9px 16px #ffffff' }, 'dark': { 'bg_color': '#2d3436', 'text_color': '#fff', 'shadow': '9px 9px 16px #1a1d1e, -9px -9px 16px #404b4d' }, 'blue': { 'bg_color': '#e3f2fd', 'text_color': '#1976d2', 'shadow': '9px 9px 16px #c1cdd4, -9px -9px 16px #ffffff' } } def load_custom_styles(theme='light'): return f""" """ class BankingAssistant: def __init__(self): self.db = DatabaseManager() self.model = BankingModel() # اضافه کردن مدل if 'theme' not in st.session_state: st.session_state.theme = 'light' if 'messages' not in st.session_state: st.session_state.messages = [] self.add_message('assistant', """ 👋 سلام! من دستیار هوشمند بانکی شما هستم. می‌توانم در موارد زیر به شما کمک کنم: 📊 مشاهده وضعیت حساب 💳 انتقال وجه 📝 درخواست تسهیلات 🏦 اطلاعات شعب چطور می‌توانم کمکتان کنم؟ """) def add_message(self, role, content): timestamp = datetime.now().strftime("%H:%M") st.session_state.messages.append({ 'role': role, 'content': content, 'timestamp': timestamp }) # ذخیره در دیتابیس if role == 'user': self.db.conn.execute( 'INSERT INTO conversations (user_message, timestamp) VALUES (?, ?)', (content, timestamp) ) else: self.db.conn.execute( 'UPDATE conversations SET assistant_response = ? WHERE id = last_insert_rowid()', (content,) ) self.db.conn.commit() def render_chat_interface(self): st.markdown(load_custom_styles(st.session_state.theme), unsafe_allow_html=True) # هدر اصلی st.markdown("""

🏦 دستیار هوشمند بانکی

پاسخگوی 24 ساعته شما

""", unsafe_allow_html=True) # باکس چت st.markdown('
', unsafe_allow_html=True) for msg in st.session_state.messages: class_name = "user" if msg['role'] == 'user' else "assistant" st.markdown(f"""
{msg['content']} {msg['timestamp']}
""", unsafe_allow_html=True) st.markdown('
', unsafe_allow_html=True) # باکس ورودی st.markdown("""
""", unsafe_allow_html=True) class AdminDashboard: def __init__(self, db_manager): self.db = db_manager def render_dashboard(self): st.markdown("""

🔐 پنل مدیریت

""", unsafe_allow_html=True) # نمودارهای تحلیلی col1, col2 = st.columns(2) with col1: self.render_conversation_stats() with col2: self.render_feedback_chart() # مدیریت پایگاه دانش st.markdown("""

📚 مدیریت پایگاه دانش

""", unsafe_allow_html=True) # افزودن دانش جدید with st.expander("➕ افزودن مورد جدید"): category = st.selectbox( "دسته‌بندی", ["عمومی", "حساب‌ها", "تسهیلات", "کارت", "شعب"] ) question = st.text_area("سوال") answer = st.text_area("پاسخ") if st.button("ذخیره"): self.db.conn.execute( 'INSERT INTO knowledge_base (question, answer, category) VALUES (?, ?, ?)', (question, answer, category) ) self.db.conn.commit() st.success("✅ با موفقیت ذخیره شد") def render_conversation_stats(self): # دریافت آمار مکالمات df = pd.read_sql_query(""" SELECT date(timestamp) as date, COUNT(*) as count FROM conversations GROUP BY date(timestamp) ORDER BY date DESC LIMIT 7 """, self.db.conn) fig = px.line( df, x='date', y='count', title='آمار مکالمات 7 روز اخیر', labels={'count': 'تعداد مکالمات', 'date': 'تاریخ'} ) fig.update_layout( font_family="Vazirmatn", plot_bgcolor='rgba(0,0,0,0)', paper_bgcolor='rgba(0,0,0,0)', ) st.plotly_chart(fig) def render_feedback_chart(self): # نمودار بازخوردها df = pd.read_sql_query(""" SELECT feedback, COUNT(*) as count FROM conversations WHERE feedback != 0 GROUP BY feedback """, self.db.conn) fig = px.pie( df, values='count', names='feedback', title='نمودار بازخوردها', color_discrete_sequence=px.colors.sequential.Blues ) fig.update_layout( font_family="Vazirmatn", plot_bgcolor='rgba(0,0,0,0)', paper_bgcolor='rgba(0,0,0,0)', ) st.plotly_chart(fig) def main(): st.set_page_config( page_title="دستیار هوشمند بانکی", page_icon="🏦", layout="wide", initial_sidebar_state="expanded" ) assistant = BankingAssistant() # منوی کناری with st.sidebar: st.markdown("### ⚙️ تنظیمات") theme = st.selectbox( "انتخاب تم", options=['light', 'dark', 'blue'], index=['light', 'dark', 'blue'].index(st.session_state.theme) ) if theme != st.session_state.theme: st.session_state.theme = theme st.experimental_rerun() if st.button("🔐 ورود مدیر"): st.session_state.show_login = True # نمایش فرم لاگین if st.session_state.get('show_login', False): with st.form("login_form"): username = st.text_input("نام کاربری") password = st.text_input("رمز عبور", type="password") if st.form_submit_button("ورود"): if username == "admin" and password == "admin": # در حالت واقعی باید امن‌تر باشد st.session_state.admin_logged_in = True st.session_state.show_login = False st.experimental_rerun() else: st.error("نام کاربری یا رمز عبور اشتباه است") # نمایش داشبورد مدیر if st.session_state.get('admin_logged_in', False): admin = AdminDashboard(assistant.db) admin.render_dashboard() else: assistant.render_chat_interface() if __name__ == "__main__": main()