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()