169 lines
5.3 KiB
Plaintext
169 lines
5.3 KiB
Plaintext
from flask import Flask, request, jsonify, redirect, url_for, session, render_template
|
|
from flask_sqlalchemy import SQLAlchemy
|
|
from werkzeug.security import generate_password_hash, check_password_hash
|
|
from flask_session import Session
|
|
from flask_login import LoginManager, UserMixin, login_user, login_required, logout_user, current_user, login_manager
|
|
|
|
app = Flask(__name__)
|
|
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///vocab.db'
|
|
app.config['SECRET_KEY'] = 'your_secret_key' # Ändere dies zu einem echten geheimen Schlüssel
|
|
app.config['SESSION_TYPE'] = 'filesystem'
|
|
app.config['SESSION_PERMANENT'] = False
|
|
app.config['SESSION_USE_SIGNER'] = True
|
|
|
|
db = SQLAlchemy(app)
|
|
Session(app)
|
|
|
|
# Flask-Login Setup
|
|
login_manager = LoginManager()
|
|
login_manager.init_app(app)
|
|
login_manager.login_view = 'login'
|
|
|
|
# Models
|
|
class User(db.Model, UserMixin):
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
username = db.Column(db.String(150), unique=True, nullable=False)
|
|
password = db.Column(db.String(150), nullable=False)
|
|
vocabularies = db.relationship('Vocabulary', backref='owner', lazy=True)
|
|
|
|
class Vocabulary(db.Model):
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
english = db.Column(db.String(100), nullable=False)
|
|
german = db.Column(db.String(100), nullable=False)
|
|
level = db.Column(db.Integer, nullable=False)
|
|
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
|
|
|
|
# User loader callback for Flask-Login
|
|
@login_manager.user_loader
|
|
def load_user(user_id):
|
|
return User.query.get(int(user_id))
|
|
|
|
# Route Handlers
|
|
@app.route('/')
|
|
def index():
|
|
return render_template('start.html')
|
|
|
|
@app.route('/train')
|
|
@login_required
|
|
def train():
|
|
return render_template('train.html') # Stelle sicher, dass diese Datei existiert
|
|
|
|
@app.route('/settings')
|
|
@login_required
|
|
def settings():
|
|
return render_template('settings.html') # Stelle sicher, dass diese Datei existiert
|
|
|
|
@app.route('/vocab')
|
|
@login_required
|
|
def vocab():
|
|
return render_template('vocab.html')
|
|
|
|
@app.route('/register', methods=['POST'])
|
|
def register():
|
|
username = request.form.get('username')
|
|
password = request.form.get('password')
|
|
if not username or not password:
|
|
return jsonify({'error': 'Username and password are required'}), 400
|
|
|
|
hashed_password = generate_password_hash(password, method='pbkdf2:sha256')
|
|
user = User(username=username, password=hashed_password)
|
|
|
|
try:
|
|
db.session.add(user)
|
|
db.session.commit()
|
|
return jsonify({'success': True}), 201
|
|
except Exception as e:
|
|
db.session.rollback()
|
|
return jsonify({'error': str(e)}), 500
|
|
|
|
@app.route('/login', methods=['POST'])
|
|
def login():
|
|
username = request.form['username']
|
|
password = request.form['password']
|
|
|
|
user = User.query.filter_by(username=username).first()
|
|
if user and check_password_hash(user.password, password):
|
|
session['logged_in'] = True
|
|
session['user_id'] = user.id
|
|
return redirect('/settings')
|
|
else:
|
|
return jsonify({"error": "Invalid credentials"}), 401
|
|
|
|
|
|
@app.route('/logout', methods=['POST'])
|
|
@login_required
|
|
def logout():
|
|
logout_user()
|
|
return redirect(url_for('index'))
|
|
|
|
@app.route('/add_vocab', methods=['POST'])
|
|
@login_required
|
|
def add_vocab():
|
|
english = request.form.get('english')
|
|
german = request.form.get('german')
|
|
level = int(request.form.get('level'))
|
|
|
|
if not english or not german or not level:
|
|
return jsonify({'error': 'All fields are required'}), 400
|
|
|
|
vocab = Vocabulary(english=english, german=german, level=level, user_id=current_user.id)
|
|
try:
|
|
db.session.add(vocab)
|
|
db.session.commit()
|
|
return jsonify({'success': True}), 201
|
|
except Exception as e:
|
|
db.session.rollback()
|
|
return jsonify({'error': str(e)}), 500
|
|
|
|
@app.route('/update_vocab/<int:id>', methods=['PUT'])
|
|
@login_required
|
|
def update_vocab(id):
|
|
vocab = Vocabulary.query.get(id)
|
|
if not vocab or vocab.user_id != current_user.id:
|
|
return jsonify({'error': 'Not found or unauthorized'}), 404
|
|
|
|
english = request.json.get('english')
|
|
german = request.json.get('german')
|
|
level = request.json.get('level')
|
|
|
|
if english:
|
|
vocab.english = english
|
|
if german:
|
|
vocab.german = german
|
|
if level:
|
|
vocab.level = level
|
|
|
|
try:
|
|
db.session.commit()
|
|
return jsonify({'success': True}), 200
|
|
except Exception as e:
|
|
db.session.rollback()
|
|
return jsonify({'error': str(e)}), 500
|
|
|
|
@app.route('/delete_vocab/<int:id>', methods=['DELETE'])
|
|
@login_required
|
|
def delete_vocab(id):
|
|
vocab = Vocabulary.query.get(id)
|
|
if not vocab or vocab.user_id != current_user.id:
|
|
return jsonify({'error': 'Not found or unauthorized'}), 404
|
|
|
|
try:
|
|
db.session.delete(vocab)
|
|
db.session.commit()
|
|
return jsonify({'success': True}), 200
|
|
except Exception as e:
|
|
db.session.rollback()
|
|
return jsonify({'error': str(e)}), 500
|
|
|
|
@app.route('/get_vocab', methods=['GET'])
|
|
@login_required
|
|
def get_vocab():
|
|
vocab_list = Vocabulary.query.filter_by(user_id=current_user.id).all()
|
|
result = [{'id': v.id, 'english': v.english, 'german': v.german, 'level': v.level} for v in vocab_list]
|
|
return jsonify(result)
|
|
|
|
if __name__ == '__main__':
|
|
with app.app_context():
|
|
db.create_all()
|
|
app.run(debug=True)
|