Erstes Frontend Layout erstellt.
This commit is contained in:
@@ -0,0 +1,13 @@
|
||||
FROM python:3.11-slim
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
# Erfordert keine schweren Systempakete, das beschleunigt auch den Build!
|
||||
# Wir installieren direkt die benötigten Python-Bibliotheken
|
||||
RUN pip3 install --no-cache-dir streamlit pandas plotly
|
||||
|
||||
# Port für Streamlit öffnen
|
||||
EXPOSE 8501
|
||||
|
||||
# Streamlit starten und an alle Netzwerk-Schnittstellen binden
|
||||
ENTRYPOINT ["streamlit", "run", "app.py", "--server.port=8501", "--server.address=0.0.0.0"]
|
||||
@@ -0,0 +1,82 @@
|
||||
import streamlit as st
|
||||
import pandas as pd
|
||||
import plotly.express as px
|
||||
|
||||
# Umrechnungsfaktor von Terabytes nach Bytes
|
||||
TB2B = 1024**4
|
||||
|
||||
# Seitenkonfiguration (gibt uns ein schönes breites Layout)
|
||||
st.set_page_config(layout="wide")
|
||||
|
||||
# 1. Daten laden (Pfad aus deinem Docker-Setup)
|
||||
FILE_PATH = "/data/json_cache.json"
|
||||
|
||||
|
||||
@st.cache_data
|
||||
def load_data():
|
||||
# Falls die Datei existiert, laden, sonst leeres Dataframe für den Test
|
||||
try:
|
||||
return pd.read_json(FILE_PATH)
|
||||
except Exception:
|
||||
# Dummy-Daten, falls Node-RED noch nichts abgelegt hat
|
||||
return pd.DataFrame([
|
||||
{"ownerGroup": "a-123", "department": "4000", "size": 500000},
|
||||
{"ownerGroup": "p9999", "department": "6000", "size": 1200000}
|
||||
])
|
||||
|
||||
|
||||
df = load_data()
|
||||
|
||||
# 2. NAVIGATION LINKS (Sidebar)
|
||||
st.sidebar.title("Navigation")
|
||||
st.sidebar.markdown("Wählen Sie eine Ansicht:")
|
||||
|
||||
# Ein Radio-Button verhält sich wie eine klickbare Liste
|
||||
auswahl = st.sidebar.radio(
|
||||
label="Ansichten",
|
||||
options=["Übersicht & Metriken", "Bereichs-Analyse", "Nicht zuweisbare Daten", "Rohdaten"],
|
||||
label_visibility="collapsed" # Versteckt das Label für eine sauberere Optik
|
||||
)
|
||||
|
||||
# 3. ANZEIGE RECHTS (Hauptbildschirm)
|
||||
# Hier steuern wir den Inhalt basierend auf der Auswahl links
|
||||
|
||||
if auswahl == "Übersicht & Metriken":
|
||||
st.title("Übersicht")
|
||||
|
||||
# Beispiel für schnelle Metriken rechts
|
||||
col1, col2 = st.columns(2)
|
||||
col1.metric("Anzahl Archivgruppen", len(df))
|
||||
col2.metric("Gesamtvolumen (TB)", f'{df["size"].sum()/TB2B:.2f}' if "size" in df else "0.00")
|
||||
|
||||
# Hier könnte eine Grafik hin
|
||||
if "department" in df:
|
||||
fig = px.pie(df, names="department", title="Verteilung nach Departments")
|
||||
st.plotly_chart(fig, use_container_width=True)
|
||||
|
||||
elif auswahl == "Bereichs-Analyse":
|
||||
st.title("Bereichs-Analyse")
|
||||
st.write("Filtern Sie die Daten gezielt nach einzelnen Abteilungen.")
|
||||
|
||||
# Ein zusätzlicher Filter, der nur in dieser Ansicht erscheint
|
||||
if "department" in df:
|
||||
depts = sorted(df["department"].unique().tolist())
|
||||
gewaehltes_dept = st.selectbox("Wählen Sie ein Department:", depts)
|
||||
|
||||
filtered_df = df[df["department"] == gewaehltes_dept]
|
||||
st.metric(f"Gruppen in Department {gewaehltes_dept}", len(filtered_df))
|
||||
st.dataframe(filtered_df, use_container_width=True)
|
||||
|
||||
elif auswahl == "Nicht zuweisbare Daten":
|
||||
st.title("Nicht zuweisbare Daten")
|
||||
|
||||
# Die Tabelle, die du schon gebaut hast
|
||||
st.dataframe(df, use_container_width=True)
|
||||
|
||||
elif auswahl == "Rohdaten":
|
||||
st.title("Rohdaten")
|
||||
st.write("Durchsuchen und filtern Sie die vollständige Liste der Gruppen.")
|
||||
|
||||
# Die Tabelle, die du schon gebaut hast
|
||||
st.dataframe(df, use_container_width=True)
|
||||
|
||||
Reference in New Issue
Block a user