Dashboard for managing service
To upload files, please first save the app
import streamlit as st
import pandas as pd
from datetime import datetime
from sqlalchemy import create_engine, Column, Integer, String, DateTime, Float
from sqlalchemy.orm import Session, DeclarativeBase
# Database setup
class Base(DeclarativeBase):
pass
class Service(Base):
__tablename__ = 'services'
id = Column(Integer, primary_key=True)
name = Column(String(100), nullable=False)
description = Column(String(500))
price = Column(Float, nullable=False)
duration = Column(Integer) # Duration in minutes
created_at = Column(DateTime, default=datetime.utcnow)
# Create database and tables
engine = create_engine('sqlite:///services.db')
Base.metadata.create_all(engine)
# App title
st.title('Service Management Dashboard')
# Sidebar for adding new services
with st.sidebar:
st.header('Add New Service')
name = st.text_input('Service Name')
description = st.text_area('Description')
price = st.number_input('Price ($)', min_value=0.0, value=0.0, step=0.01)
duration = st.number_input('Duration (minutes)', min_value=1, value=30)
if st.button('Add Service'):
with Session(engine) as session:
new_service = Service(
name=name,
description=description,
price=price,
duration=duration
)
session.add(new_service)
session.commit()
st.success('Service added successfully!')
# Main content area
st.header('Services List')
# Get all services
with Session(engine) as session:
services = session.query(Service).all()
if not services:
st.info('No services available. Add your first service using the sidebar!')
else:
# Convert to DataFrame for display
services_data = [{
'ID': s.id,
'Name': s.name,
'Description': s.description,
'Price ($)': f"${s.price:.2f}",
'Duration (min)': s.duration,
'Created': s.created_at.strftime('%Y-%m-%d %H:%M')
} for s in services]
df = pd.DataFrame(services_data)
st.dataframe(df, use_container_width=True)
# Service management section
if services:
st.header('Manage Services')
# Select service to edit/delete
selected_service_id = st.selectbox(
'Select a service to manage',
options=[s.id for s in services],
format_func=lambda x: next(s.name for s in services if s.id == x)
)
with Session(engine) as session:
service = session.query(Service).filter_by(id=selected_service_id).first()
# Create columns for edit and delete buttons
col1, col2 = st.columns(2)
with col1:
if st.button('Edit Service'):
st.session_state.editing = True
st.session_state.service_id = service.id
with col2:
if st.button('Delete Service'):
session.delete(service)
session.commit()
st.success('Service deleted successfully!')
st.rerun()
# Edit form
if st.session_state.get('editing', False) and st.session_state.get('service_id') == service.id:
st.subheader('Edit Service')
edited_name = st.text_input('Service Name', value=service.name)
edited_description = st.text_area('Description', value=service.description)
edited_price = st.number_input('Price ($)', value=service.price, min_value=0.0, step=0.01)
edited_duration = st.number_input('Duration (minutes)', value=service.duration, min_value=1)
if st.button('Save Changes'):
service.name = edited_name
service.description = edited_description
service.price = edited_price
service.duration = edited_duration
session.commit()
st.success('Service updated successfully!')
st.session_state.editing = False
st.rerun()
# Add some metrics at the top
with Session(engine) as session:
total_services = session.query(Service).count()
if total_services > 0:
avg_price = session.query(Service).with_entities(func.avg(Service.price)).scalar()
avg_duration = session.query(Service).with_entities(func.avg(Service.duration)).scalar()
# Display metrics
col1, col2, col3 = st.columns(3)
with col1:
st.metric('Total Services', total_services)
with col2:
st.metric('Average Price', f"${avg_price:.2f}" if avg_price else "$0.00")
with col3:
st.metric('Average Duration', f"{int(avg_duration)} min" if avg_duration else "0 min")
Hi! I can help you with any questions about Streamlit and Python. What would you like to know?