diff --git a/backend/__pycache__/datenbankverbindung.cpython-313.pyc b/backend/__pycache__/datenbankverbindung.cpython-313.pyc new file mode 100644 index 0000000..42d025c Binary files /dev/null and b/backend/__pycache__/datenbankverbindung.cpython-313.pyc differ diff --git a/backend/app.py b/backend/app.py index 120c6df..e03fb3c 100644 --- a/backend/app.py +++ b/backend/app.py @@ -1,23 +1,77 @@ -from flask import Flask, request, jsonify -from flask_cors import CORS +from flask import Flask, request, render_template, jsonify, redirect, send_from_directory +from datenbankverbindung import lade_db_config, speichere_db_config, teste_verbindung, initialisiere_admin_user + +import time +import os app = Flask(__name__) -CORS(app) # CORS für React +app.template_folder = "templates" -@app.route('/api/login', methods=['POST']) -def login(): - data = request.get_json() - username = data.get('username') - password = data.get('password') +CONFIG_PATH = "config/db_config.json" +MAX_WAIT = 30 # In Sekunden +WAIT_INTERVAL = 10 - # Temporär: hardcodierter Benutzer - if username == 'admin' and password == 'admin': - return jsonify({ - 'token': 'mock-token', - 'role': 'admin' - }) +def ist_konfiguriert(): + return os.path.exists(CONFIG_PATH) - return jsonify({'message': 'Ungültige Login-Daten'}), 401 +def versuche_verbindung_mit_warten(): + elapsed = 0 + if not ist_konfiguriert(): + return False + config = lade_db_config() + while not teste_verbindung(config) and elapsed < MAX_WAIT: + print(f"[INFO] DB nicht erreichbar – warte {WAIT_INTERVAL}s...") + time.sleep(WAIT_INTERVAL) + elapsed += WAIT_INTERVAL + return elapsed < MAX_WAIT + +@app.route('/api/status') +def status(): + if not ist_konfiguriert(): + return jsonify({"status": "init", "db_connected": False}) + elif teste_verbindung(lade_db_config()): + return jsonify({"status": "ready", "db_connected": True}) + else: + return jsonify({"status": "error", "db_connected": False}) + +@app.route('/setup', methods=['GET', 'POST']) +def setup(): + if request.method == 'POST': + db_config = { + "host": request.form['host'], + "port": int(request.form['port']), + "user": request.form['user'], + "password": request.form['password'], + "database": request.form['database'] + } + speichere_db_config(db_config) + if teste_verbindung(db_config): + initialisiere_admin_user(db_config) # <- das hier NEU + return redirect('/') + + else: + return "Verbindung fehlgeschlagen. Bitte zurück und prüfen.", 500 + return render_template('setup.html') + +@app.route('/', defaults={'path': ''}) +@app.route('/') +def serve_react(path): + if not ist_konfiguriert() or not teste_verbindung(lade_db_config()): + return redirect('/setup') + + # setup und API dürfen nicht von React überdeckt werden + if path.startswith('setup') or path.startswith('api'): + return redirect(f'/{path}') + + # Pfad zu frontend/dist absolut auflösen + dist_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'frontend', 'dist')) + file_path = os.path.join(dist_dir, path) + + if path and os.path.exists(file_path): + return send_from_directory(dist_dir, path) + else: + return send_from_directory(dist_dir, 'index.html') if __name__ == '__main__': - app.run(host='127.0.0.1', port=5000, debug=True) + os.makedirs("config", exist_ok=True) + app.run(host='127.0.0.1', port=5000) diff --git a/backend/config/db_config.json b/backend/config/db_config.json index e0eb1be..deb9f7f 100644 --- a/backend/config/db_config.json +++ b/backend/config/db_config.json @@ -1,7 +1,7 @@ { - "host": "192.168.50.100", + "host": "192.168.50.36", "port": 3306, - "user": "mein_user", - "password": "mein_passwort", - "database": "meine_datenbank" -} + "user": "admin", + "password": "admin", + "database": "Tools" +} \ No newline at end of file diff --git a/backend/datenbankverbindung.py b/backend/datenbankverbindung.py new file mode 100644 index 0000000..c3e8316 --- /dev/null +++ b/backend/datenbankverbindung.py @@ -0,0 +1,47 @@ +import json +import mysql.connector + +def lade_db_config(pfad='config/db_config.json'): + with open(pfad, 'r') as f: + return json.load(f) + +def speichere_db_config(daten, pfad='config/db_config.json'): + with open(pfad, 'w') as f: + json.dump(daten, f, indent=2) + +def teste_verbindung(db_config): + try: + conn = mysql.connector.connect(**db_config) + conn.close() + return True + except mysql.connector.Error as e: + print(f"[Fehler] DB-Verbindung fehlgeschlagen: {e}") + return False + +def initialisiere_admin_user(db_config): + import mysql.connector + conn = mysql.connector.connect(**db_config) + cursor = conn.cursor() + + # Tabelle erstellen, falls nicht vorhanden + cursor.execute(""" + CREATE TABLE IF NOT EXISTS users ( + id INT AUTO_INCREMENT PRIMARY KEY, + username VARCHAR(255) UNIQUE NOT NULL, + password VARCHAR(255) NOT NULL, + role ENUM('user', 'admin') NOT NULL DEFAULT 'user' + ) + """) + + # Prüfen, ob admin existiert + cursor.execute("SELECT id FROM users WHERE username = 'admin'") + if not cursor.fetchone(): + cursor.execute(""" + INSERT INTO users (username, password, role) + VALUES (%s, %s, 'admin') + """, ('admin', 'admin')) + print("[INFO] Admin-Account wurde erstellt: admin / admin") + + conn.commit() + cursor.close() + conn.close() diff --git a/backend/requirements.txt b/backend/requirements.txt index f0861ea..06523e7 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -1,2 +1,3 @@ flask flask-cors +mysql-connector-python \ No newline at end of file diff --git a/backend/templates/setup.html b/backend/templates/setup.html new file mode 100644 index 0000000..614ab60 --- /dev/null +++ b/backend/templates/setup.html @@ -0,0 +1,17 @@ + + + + Ersteinrichtung + + +

Datenbank-Verbindung einrichten

+
+

+

+

+

+

+ +
+ +