From f406f9f75e3baf577917bc9ea60f82f1ace3cc1b Mon Sep 17 00:00:00 2001 From: Anh-Thy04 Date: Tue, 22 Apr 2025 00:29:23 +0200 Subject: [PATCH] changed files on the frontend --- AT_frontend/.gitignore | 3 +- AT_frontend/app.py | 155 +++-------------------- AT_frontend/static/images/car.png | Bin 0 -> 4233 bytes AT_frontend/static/images/logo-light.png | Bin 0 -> 8763 bytes AT_frontend/templates/dashboard.html | 86 +++---------- AT_frontend/templates/login.html | 75 +++++++++++ 6 files changed, 113 insertions(+), 206 deletions(-) create mode 100644 AT_frontend/static/images/car.png create mode 100644 AT_frontend/static/images/logo-light.png create mode 100644 AT_frontend/templates/login.html diff --git a/AT_frontend/.gitignore b/AT_frontend/.gitignore index 860b323..927797f 100644 --- a/AT_frontend/.gitignore +++ b/AT_frontend/.gitignore @@ -1,2 +1 @@ -.venv/ -__pychache__/ \ No newline at end of file +.venvs/ \ No newline at end of file diff --git a/AT_frontend/app.py b/AT_frontend/app.py index b1af769..f727eb4 100644 --- a/AT_frontend/app.py +++ b/AT_frontend/app.py @@ -1,152 +1,35 @@ -from flask import Flask, render_template, request, redirect, url_for, flash, session +from flask import Flask, render_template, session, redirect, url_for, session from flask_wtf import FlaskForm -from wtforms import StringField, PasswordField, BooleanField, SubmitField +from wtforms import (StringField, BooleanField, + RadioField, SelectField, + TextAreaField, SubmitField) from wtforms.validators import DataRequired -from functools import wraps -import os -from flask_sqlalchemy import SQLAlchemy -from datetime import datetime app = Flask(__name__) -app.config['SECRET_KEY'] = 'your-secret-key' # Change this to a random string -# Database configuration - update with your friend's database info -app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///logs.db' # Change this to match your friend's DB -app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False -db = SQLAlchemy(app) +app.config['SECRET_KEY'] = 'mijngeheimesleutel' -# Simple log model - adjust to match your friend's database structure -class Log(db.Model): - id = db.Column(db.Integer, primary_key=True) - action = db.Column(db.String(100), nullable=False) - timestamp = db.Column(db.DateTime, default=datetime.utcnow) - - def __repr__(self): - return f"Log('{self.action}', '{self.timestamp}')" +class InfoForm(FlaskForm): -# Keep your existing user dictionary for authentication -users = { - "admin": {"password": "admin123", "role": "admin"}, - "user": {"password": "user123", "role": "user"} -} + naam = StringField('Wat is je naam?',validators=[DataRequired()]) + vrouw = BooleanField("Ben je een vrouw?") + instrument = RadioField('Welk instrument wil je leren bespelen?', choices=[('ins_een','Gitaar'),('ins_twee','Drums')]) + plaats = SelectField(u'Welke locatie heeft de voorkeur?', + choices=[('as', 'Assen'), ('dr', 'Drachten'), ('gr', 'Groningen')]) + feedback = TextAreaField() + submit = SubmitField('Verzend') -# Add a function to create a new log entry -def add_log(action): - log = Log(action=action) - db.session.add(log) - db.session.commit() - -class LoginForm(FlaskForm): - username = StringField('Username', validators=[DataRequired()]) - password = PasswordField('Password', validators=[DataRequired()]) - remember = BooleanField('Remember Me') - -class GateControlForm(FlaskForm): - open_gate = SubmitField('Open Gate') - close_gate = SubmitField('Close Gate') - check_camera = SubmitField('Check Camera') - debug_mode = BooleanField('Debug Mode') - -def login_required(f): - @wraps(f) - def decorated_function(*args, **kwargs): - if 'logged_in' not in session: - return redirect(url_for('login')) - return f(*args, **kwargs) - return decorated_function - -def admin_required(f): - @wraps(f) - def decorated_function(*args, **kwargs): - if 'role' not in session or session['role'] != 'admin': - flash('You need to be an admin to access this page.') - return redirect(url_for('login')) - return f(*args, **kwargs) - return decorated_function - -@app.route('/') +@app.route('/', methods=['GET', 'POST']) def index(): - if 'logged_in' in session: - if session['role'] == 'admin': - return redirect(url_for('dashboard')) - return redirect(url_for('user_page')) - return redirect(url_for('login')) -@app.route('/login', methods=['GET', 'POST']) -def login(): - form = LoginForm() - error = None - - if request.method == 'POST': - username = request.form['username'] - password = request.form['password'] - - if username in users and users[username]['password'] == password: - session['logged_in'] = True - session['username'] = username - session['role'] = users[username]['role'] - - # Log the login action - add_log(f"User {username} logged in") - - if users[username]['role'] == 'admin': - return redirect(url_for('dashboard')) - else: - return redirect(url_for('user_page')) - else: - # Log the failed login attempt - add_log(f"Failed login attempt for user {username}") - error = 'Invalid credentials. Please try again.' - - return render_template('inlog.html', form=form, error=error) - -@app.route('/dashboard', methods=['GET', 'POST']) -@login_required -@admin_required -def dashboard(): - form = GateControlForm() - gate_status = "Closed" - camera_status = "Inactive" - debug_mode = False - - # Get the most recent logs to display - recent_logs = Log.query.order_by(Log.timestamp.desc()).limit(10).all() - + form = InfoForm() if form.validate_on_submit(): - if form.open_gate.data: - gate_status = "Open" - add_log("Gate opened by " + session['username']) - elif form.close_gate.data: - gate_status = "Closed" - add_log("Gate closed by " + session['username']) - elif form.check_camera.data: - camera_status = "Active" - add_log("Camera checked by " + session['username']) - - debug_mode = form.debug_mode.data - if debug_mode: - add_log("Debug mode enabled by " + session['username']) - - return render_template('dashboard.html', form=form, gate_status=gate_status, - camera_status=camera_status, debug_mode=debug_mode, - recent_logs=recent_logs) -@app.route('/user') -@login_required -def user_page(): - add_log(f"User {session['username']} accessed user page") - return "Regular user page - Access restricted" + session['naam'] = form.username.data + session['password'] = form.password.data -@app.route('/logout') -def logout(): - if 'username' in session: - add_log(f"User {session['username']} logged out") - session.clear() - return redirect(url_for('login')) - -# Initialize database -with app.app_context(): - db.create_all() + return render_template('dashboard.html') + return render_template('login.html', form=form) if __name__ == '__main__': app.run(debug=True) \ No newline at end of file diff --git a/AT_frontend/static/images/car.png b/AT_frontend/static/images/car.png new file mode 100644 index 0000000000000000000000000000000000000000..0c438c799d6de7c99cc9eff4ad88ba2e84a61748 GIT binary patch literal 4233 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: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 -
-
-
-
Gate Control Dashboard
-
- {{ form.hidden_tag() }} -
- {{ form.open_gate(class="btn btn-dark") }} -
-
- {{ form.close_gate(class="btn btn-dark") }} -
-
- {{ form.check_camera(class="btn btn-dark") }} -
-
- {{ form.debug_mode() }} - -
-
- -
-
-
Gate Status: {{ gate_status }}
-
Camera Status: {{ camera_status }}
- {% if debug_mode %} - Debug Mode is Enabled - {% endif %} -
-
-
-
-
-
-
System Logs
-
- - - - - - - - - - {% for log in recent_logs %} - - - - - - {% endfor %} - -
TimeActionStatus
{{ log.timestamp.strftime('%H:%M:%S') }}{{ log.action }} - - {{ log.status }} - -
-
-
-
-
- - -{% endblock %} \ No newline at end of file + + + + + + Document + + +

Bedankt voor de moeite.
Dit zijn de ingevulde gegevens:

+
    +
  • Naam: {{ session['naam'] }}
  • +
  • Geslacht: {{ session['geslacht'] }}
  • +
  • Instrument: {{ session['instrument'] }}
  • +
  • Plaats: {{ session['plaats'] }}
  • +
  • Feedback: {{ session['feedback'] }}
  • +
+ + \ No newline at end of file diff --git a/AT_frontend/templates/login.html b/AT_frontend/templates/login.html new file mode 100644 index 0000000..168127e --- /dev/null +++ b/AT_frontend/templates/login.html @@ -0,0 +1,75 @@ + + + + + + + Login + + + +
+
+ +
+
+
+
+
+
+ + + + +
+
+ +
+
+
+
+
+
+ Moving Image +
+ + + \ No newline at end of file