Datenbank verbindung + User Admin angelegt

This commit is contained in:
Nirodan
2025-06-14 18:45:33 +02:00
parent ec58e3ba79
commit a3e521e458
6 changed files with 140 additions and 21 deletions
+70 -16
View File
@@ -1,23 +1,77 @@
from flask import Flask, request, jsonify from flask import Flask, request, render_template, jsonify, redirect, send_from_directory
from flask_cors import CORS from datenbankverbindung import lade_db_config, speichere_db_config, teste_verbindung, initialisiere_admin_user
import time
import os
app = Flask(__name__) app = Flask(__name__)
CORS(app) # CORS für React app.template_folder = "templates"
@app.route('/api/login', methods=['POST']) CONFIG_PATH = "config/db_config.json"
def login(): MAX_WAIT = 30 # In Sekunden
data = request.get_json() WAIT_INTERVAL = 10
username = data.get('username')
password = data.get('password')
# Temporär: hardcodierter Benutzer def ist_konfiguriert():
if username == 'admin' and password == 'admin': return os.path.exists(CONFIG_PATH)
return jsonify({
'token': 'mock-token',
'role': 'admin'
})
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('/<path:path>')
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__': 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)
+5 -5
View File
@@ -1,7 +1,7 @@
{ {
"host": "192.168.50.100", "host": "192.168.50.36",
"port": 3306, "port": 3306,
"user": "mein_user", "user": "admin",
"password": "mein_passwort", "password": "admin",
"database": "meine_datenbank" "database": "Tools"
} }
+47
View File
@@ -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()
+1
View File
@@ -1,2 +1,3 @@
flask flask
flask-cors flask-cors
mysql-connector-python
+17
View File
@@ -0,0 +1,17 @@
<!DOCTYPE html>
<html>
<head>
<title>Ersteinrichtung</title>
</head>
<body>
<h2>Datenbank-Verbindung einrichten</h2>
<form method="post">
<label>Host: <input name="host" required></label><br><br>
<label>Port: <input name="port" value="3306" required></label><br><br>
<label>Nutzername: <input name="user" required></label><br><br>
<label>Passwort: <input name="password" type="password" required></label><br><br>
<label>Datenbankname: <input name="database" required></label><br><br>
<button type="submit">Speichern & Verbinden</button>
</form>
</body>
</html>