From a3e521e4588be9c2d82da1a03cec71506608f6ba Mon Sep 17 00:00:00 2001 From: Nirodan Date: Sat, 14 Jun 2025 18:45:33 +0200 Subject: [PATCH] Datenbank verbindung + User Admin angelegt --- .../datenbankverbindung.cpython-313.pyc | Bin 0 -> 2565 bytes backend/app.py | 86 ++++++++++++++---- backend/config/db_config.json | 10 +- backend/datenbankverbindung.py | 47 ++++++++++ backend/requirements.txt | 1 + backend/templates/setup.html | 17 ++++ 6 files changed, 140 insertions(+), 21 deletions(-) create mode 100644 backend/__pycache__/datenbankverbindung.cpython-313.pyc create mode 100644 backend/datenbankverbindung.py create mode 100644 backend/templates/setup.html diff --git a/backend/__pycache__/datenbankverbindung.cpython-313.pyc b/backend/__pycache__/datenbankverbindung.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..42d025c4ac466f675d7cc65e408c5358d61acb34 GIT binary patch literal 2565 zcma)8-ER{|5a0W<&vs%Hl2AxfvWdvYNe)nGS~WnClU#&}b7_4x5E&FXzO!R+&gq_A znh1%cqJltMBP1jqd8yP&tyHNmmHNbgkRT+iBM+7O#GBPbYDHfsdb!G^wx>U9UU1kUeE6!f= zD&K*Kpb9`;8AftHrzVsXQ?o=T7d#w1o7aHcM~V7g9PAI(&Sa6nB%Je6ln2pWqX)&A zp_;DAf^YD1v@tq_x=|1f)O0kEOS2etAq>9^I>mLNG$XN!#Sn?J`22!ySo~!(4>Xrg zY7%Sl3+be0F=>-Jfw9#;J$x~i&*#jGv&qyI-Ow&-$%1aoCXFj!=wvo)XhkD)cwy1< z=aQN}qs`8w@3-80G`3yCjgtEjGS~zy6nm&_ob{vQtW({z zZdH&7u^Fy9rQ9X8b2*({!eb+Y=jzpn)4W@;{%%;?529{&+ZE=!nS zG(XQ-9;i=4PZjdSa@UrYkjmvv-4bL%fGsSLEKRNDsaLbbQ&Ef28*{m*pqmAKX8S`R z2O*Lsc+B%amQjUu3GEw!w$k<0>rVrHj{|+{f#W|M0CI~jLuS3J-fx=9f!2REe0xf# zS5H6n;dLM0L@a2D&1-u;`i=R;T=SoJBAx^*|5gOpcwx4K?XQj=N538nN!+6rf9MeR z=#T*Gm)AiKx&U-BMnx0QT_BrpUj^=Z6+muYR|N(a=c2UOcMWw%HeVsZZRZ;#>eaAq z$f>k}8cTZ*p;y@ARbjgqCYl`^s%ys?Y&78Tw`b=JOf9!;^PSa>efIVH86=4cp%5qC z0K6AIe0z*WiLf$0bqR-PaD$;#Dql1T_-c`8I))q-^jxkmjBN#c zq&kx}P?S7Yz-}*x>)nOy13q~Nh~-KZiAnp7{-vHO7IaHY>xI-@-q1-$bw58ppDhsR zhe+bdyHt^W-)n7r}{w7fM<1IJm>E05N$G_$uc_NPf!HYL1RwiytmU-{Z$V%jf zQU=c1m9t+*Ho+^nK9|}7Cis(Zq~2f;(?21S+rCIiHwaY$pxuDb%h7JEc62u0q@VKa z`&2wRpVx{x{S!j_1AKAF>;h8Z7>0Re=-;K AVgLXD literal 0 HcmV?d00001 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

+
+

+

+

+

+

+ +
+ +