build me a platform similar to quizlet. i need user authentication to register a user and sign up. ability to buy premium using payment processing with stripe . ability to add questions. ability to quiz yourself on questions. dashboard page showing username, questions added, button to quiz, button to upgrade acount
To upload files, please first save the app
import streamlit as st
import streamlit_authenticator as stauth
import yaml
from yaml.loader import SafeLoader
from sqlalchemy import create_engine, Column, Integer, String, Boolean, ForeignKey
from sqlalchemy.orm import Session, relationship, DeclarativeBase
import stripe
import random
# Set your Stripe API key
stripe.api_key = "your_stripe_api_key" # Replace with your actual Stripe API key
# Database setup
class Base(DeclarativeBase):
pass
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
username = Column(String, unique=True)
password = Column(String)
email = Column(String, unique=True)
is_premium = Column(Boolean, default=False)
questions = relationship("Question", back_populates="user")
class Question(Base):
__tablename__ = 'questions'
id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey('users.id'))
question = Column(String)
answer = Column(String)
user = relationship("User", back_populates="questions")
# Create SQLite database and tables
engine = create_engine('sqlite:///quiz_platform.db')
Base.metadata.create_all(engine)
# Initialize session state
if 'authenticated' not in st.session_state:
st.session_state.authenticated = False
if 'username' not in st.session_state:
st.session_state.username = None
def main():
st.title("Quiz Platform")
# Sidebar for navigation
menu = st.sidebar.selectbox(
"Menu",
["Login", "Register", "Dashboard", "Add Questions", "Take Quiz", "Upgrade to Premium"]
)
if menu == "Login":
show_login_page()
elif menu == "Register":
show_register_page()
elif not st.session_state.authenticated:
st.warning("Please login first!")
show_login_page()
elif menu == "Dashboard":
show_dashboard()
elif menu == "Add Questions":
show_add_questions()
elif menu == "Take Quiz":
show_quiz()
elif menu == "Upgrade to Premium":
show_upgrade_page()
def show_login_page():
st.header("Login")
username = st.text_input("Username")
password = st.text_input("Password", type="password")
if st.button("Login"):
with Session(engine) as session:
user = session.query(User).filter_by(username=username).first()
if user and stauth.Hasher([password]).verify(user.password)[0]:
st.session_state.authenticated = True
st.session_state.username = username
st.success("Login successful!")
st.rerun()
else:
st.error("Invalid username or password")
def show_register_page():
st.header("Register")
username = st.text_input("Username")
email = st.text_input("Email")
password = st.text_input("Password", type="password")
if st.button("Register"):
hashed_password = stauth.Hasher([password]).generate()[0]
with Session(engine) as session:
new_user = User(
username=username,
email=email,
password=hashed_password,
is_premium=False
)
session.add(new_user)
try:
session.commit()
st.success("Registration successful! Please login.")
except:
session.rollback()
st.error("Username or email already exists!")
def show_dashboard():
st.header("Dashboard")
with Session(engine) as session:
user = session.query(User).filter_by(username=st.session_state.username).first()
st.write(f"Welcome, {user.username}!")
st.write(f"Premium Status: {'Premium' if user.is_premium else 'Basic'}")
question_count = session.query(Question).filter_by(user_id=user.id).count()
st.write(f"Total Questions Added: {question_count}")
def show_add_questions():
st.header("Add Questions")
question = st.text_input("Question")
answer = st.text_input("Answer")
if st.button("Add Question"):
with Session(engine) as session:
user = session.query(User).filter_by(username=st.session_state.username).first()
new_question = Question(
user_id=user.id,
question=question,
answer=answer
)
session.add(new_question)
session.commit()
st.success("Question added successfully!")
def show_quiz():
st.header("Take Quiz")
with Session(engine) as session:
user = session.query(User).filter_by(username=st.session_state.username).first()
questions = session.query(Question).filter_by(user_id=user.id).all()
if not questions:
st.warning("No questions available. Please add some questions first!")
return
if 'current_question' not in st.session_state:
st.session_state.current_question = random.choice(questions)
st.write(st.session_state.current_question.question)
user_answer = st.text_input("Your Answer")
col1, col2 = st.columns(2)
with col1:
if st.button("Check Answer"):
if user_answer.lower() == st.session_state.current_question.answer.lower():
st.success("Correct!")
else:
st.error(f"Wrong! The correct answer is: {st.session_state.current_question.answer}")
with col2:
if st.button("Next Question"):
st.session_state.current_question = random.choice(questions)
st.rerun()
def show_upgrade_page():
st.header("Upgrade to Premium")
st.write("Get unlimited questions and advanced features!")
amount = 999 # $9.99
if st.button("Upgrade Now - $9.99"):
try:
checkout_session = stripe.checkout.Session.create(
payment_method_types=['card'],
line_items=[{
'price_data': {
'currency': 'usd',
'unit_amount': amount,
'product_data': {
'name': 'Premium Subscription',
},
},
'quantity': 1,
}],
mode='payment',
success_url='http://localhost:8501/success',
cancel_url='http://localhost:8501/cancel',
)
st.write("Redirecting to payment...")
st.markdown(f"<script>window.location.href = '{checkout_session.url}';</script>", unsafe_allow_html=True)
except Exception as e:
st.error(f"Error processing payment: {str(e)}")
if __name__ == "__main__":
main()
Hi! I can help you with any questions about Streamlit and Python. What would you like to know?