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
from sqlalchemy import create_engine, Column, Integer, String, Boolean, Float, ForeignKey
from sqlalchemy.orm import Session, DeclarativeBase, relationship
import stripe
import random
import os
# Set your Stripe API key
stripe.api_key = "your-stripe-secret-key" # Replace with your actual Stripe secret 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)
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 database and tables
engine = create_engine("sqlite:///quiz_app.db")
Base.metadata.create_all(engine)
# Initialize session state
if "authenticated" not in st.session_state:
st.session_state.authenticated = False
if "current_user" not in st.session_state:
st.session_state.current_user = None
def create_user(username, password):
with Session(engine) as session:
hashed_password = stauth.Hasher([password]).generate()[0]
new_user = User(username=username, password=hashed_password)
session.add(new_user)
session.commit()
def verify_user(username, password):
with Session(engine) as session:
user = session.query(User).filter_by(username=username).first()
if user and stauth.Hasher([password]).verify(user.password)[0]:
return user
return None
def add_question(user_id, question, answer):
with Session(engine) as session:
new_question = Question(user_id=user_id, question=question, answer=answer)
session.add(new_question)
session.commit()
def get_user_questions(user_id):
with Session(engine) as session:
return session.query(Question).filter_by(user_id=user_id).all()
def upgrade_to_premium(user_id):
with Session(engine) as session:
user = session.query(User).filter_by(id=user_id).first()
user.is_premium = True
session.commit()
st.title("QuizApp")
if not st.session_state.authenticated:
tab1, tab2 = st.tabs(["Login", "Register"])
with tab1:
st.header("Login")
login_username = st.text_input("Username", key="login_username")
login_password = st.text_input("Password", type="password", key="login_password")
if st.button("Login"):
user = verify_user(login_username, login_password)
if user:
st.session_state.authenticated = True
st.session_state.current_user = user
st.rerun()
else:
st.error("Invalid credentials")
with tab2:
st.header("Register")
reg_username = st.text_input("Username", key="reg_username")
reg_password = st.text_input("Password", type="password", key="reg_password")
if st.button("Register"):
create_user(reg_username, reg_password)
st.success("Registration successful! Please login.")
else:
# Dashboard
st.header(f"Welcome, {st.session_state.current_user.username}!")
tab1, tab2, tab3, tab4 = st.tabs(["Dashboard", "Add Questions", "Quiz", "Premium"])
with tab1:
st.subheader("Your Stats")
questions = get_user_questions(st.session_state.current_user.id)
st.write(f"Total questions added: {len(questions)}")
st.write(f"Premium status: {'Premium' if st.session_state.current_user.is_premium else 'Free'}")
with tab2:
st.subheader("Add New Question")
new_question = st.text_input("Question")
new_answer = st.text_input("Answer")
if st.button("Add Question"):
if new_question and new_answer:
add_question(st.session_state.current_user.id, new_question, new_answer)
st.success("Question added successfully!")
else:
st.error("Please fill in both question and answer")
with tab3:
st.subheader("Quiz Yourself")
questions = get_user_questions(st.session_state.current_user.id)
if questions:
if st.button("Start Quiz"):
question = random.choice(questions)
st.session_state.current_question = question
st.session_state.show_answer = False
if "current_question" in st.session_state:
st.write("Question:", st.session_state.current_question.question)
if st.button("Show Answer"):
st.write("Answer:", st.session_state.current_question.answer)
else:
st.write("Add some questions first!")
with tab4:
st.subheader("Upgrade to Premium")
if not st.session_state.current_user.is_premium:
if st.button("Upgrade ($9.99/month)"):
try:
# Create Stripe checkout session
checkout_session = stripe.checkout.Session.create(
payment_method_types=['card'],
line_items=[{
'price_data': {
'currency': 'usd',
'product_data': {
'name': 'Premium Subscription',
},
'unit_amount': 999, # $9.99 in cents
},
'quantity': 1,
}],
mode='payment',
success_url='http://localhost:8501/success',
cancel_url='http://localhost:8501/cancel',
)
st.write("Redirecting to payment...")
st.write(f"[Click here to proceed with payment]({checkout_session.url})")
except Exception as e:
st.error(f"Error: {str(e)}")
else:
st.write("You are already a premium user!")
if st.button("Logout"):
st.session_state.authenticated = False
st.session_state.current_user = None
st.rerun()
Hi! I can help you with any questions about Streamlit and Python. What would you like to know?