diff --git a/UI/main.py b/UI/main.py index 5204e15..78a175c 100644 --- a/UI/main.py +++ b/UI/main.py @@ -3,9 +3,12 @@ import subprocess import signal import atexit from flask import Flask, render_template +from flask import request, redirect, url_for, flash +from flask import session from dotenv import load_dotenv import time import socket +import utils # Load environment variables from .env file load_dotenv() @@ -19,6 +22,7 @@ backend_log_level = os.getenv('BACKEND_LOG_LEVEL') backend_data_directory = os.getenv('BACKEND_DATA_DIRECTORY') backend_log_file = os.getenv('BACKEND_LOG_FILE') backend_path = os.getenv('BACKEND_PATH') +app.secret_key = os.getenv('APP_SECRET_KEY') # Command to start the backend process backend_command = [ @@ -34,6 +38,7 @@ backend_command = [ sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((backend_ip, int(backend_port))) def ExecCommand(command): + print("sending command: ", command) command=command+'\n' sock.sendall(command.encode('utf-8')) response = sock.recv(1024*1024) @@ -59,5 +64,63 @@ def home(): def about(): return render_template('about.html') +@app.route('/login', methods=['GET', 'POST']) +def login(): + if request.method == 'POST': + username = request.form['username'] + password = request.form['password'] + + # 调用 ExecCommand 执行登录命令 + login_response = ExecCommand(f'login -u {username} -p {password}') + + if login_response.strip() == '0': + session['username'] = username # 在session中记录用户名 + return redirect(url_for('home')) + elif login_response.strip() == '-1': + error = 'Invalid username or password.' + else: + error = 'An unknown error occurred.' + + return render_template('login.html', error=error) + + return render_template('login.html') + +@app.before_request +def before_request(): + # Skip login check for login page, callback URL, and static files + if request.endpoint in ['login', 'logout']: + return + # Check if user is logged in + if ('username' not in session) or ('username' in session and utils.GetPrivilege(session['username'], ExecCommand) < 0): + if 'username' in session: + session.pop('username', None) + return redirect(url_for('login')) + +@app.route('/profile') +def profile(): + username = session['username'] + dat = ExecCommand(f'query_profile -c {username} -u {username}') + print("dat: ", dat) + # dat is something like: + profile_data = dat.split(' ') + + if len(profile_data) >= 4: + user_info = { + 'username': profile_data[0], + 'name': profile_data[1], + 'email': profile_data[2], + 'privilege': profile_data[3] + } + return render_template('profile.html', user_info=user_info) + else: + # Handle the case where the response does not contain the expected number of elements + error = "Profile data is incomplete or incorrect." + return render_template('profile.html', error=error) + +@app.route('/logout') +def logout(): + ExecCommand(f'logout -u {session["username"]}') + session.pop('username', None) # 从session中移除用户名 + return redirect(url_for('home')) if __name__ == '__main__': app.run(debug=True) diff --git a/UI/templates/base.html b/UI/templates/base.html index b7b7b1e..44cb2f4 100644 --- a/UI/templates/base.html +++ b/UI/templates/base.html @@ -4,13 +4,16 @@ {% block title %}Train Ticket Booking{% endblock %} - + +
{% block content %}{% endblock %}
+ + diff --git a/UI/templates/login.html b/UI/templates/login.html new file mode 100644 index 0000000..add3cba --- /dev/null +++ b/UI/templates/login.html @@ -0,0 +1,27 @@ +{% extends "base.html" %} + +{% block title %}Login{% endblock %} + +{% block content %} +
+
+

Login

+ {% if error %} + + {% endif %} +
+
+ + +
+
+ + +
+ +
+
+
+{% endblock %} \ No newline at end of file diff --git a/UI/templates/profile.html b/UI/templates/profile.html new file mode 100644 index 0000000..ba37a2c --- /dev/null +++ b/UI/templates/profile.html @@ -0,0 +1,37 @@ +{% extends "base.html" %} + +{% block title %}Profile{% endblock %} + +{% block content %} +
+
+

User Profile

+ {% if error %} + + {% else %} +
+
+

{{ user_info.name }}

+

Username: {{ user_info.username }}

+

Email: {{ user_info.email }}

+

Privilege: {{ user_info.privilege }}

+
+
+ {% endif %} +
+
+ + + +{% endblock %} diff --git a/UI/utils.py b/UI/utils.py new file mode 100644 index 0000000..34bcea0 --- /dev/null +++ b/UI/utils.py @@ -0,0 +1,7 @@ +def GetPrivilege(username, ExecCommand): + dat=ExecCommand(f'query_profile -c {username} -u {username}') + if dat=='-1': + return -1 + # dat is something like: + dat=dat.split(' ') + return int(dat[3]) \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 3339d95..677d570 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -54,6 +54,7 @@ void handle_client(sockpp::tcp_socket client, TicketSystemEngine &engine) { // 检查是否需要退出 if (*engine.its_time_to_exit_ptr) { + (&engine)->~TicketSystemEngine(); exit(0); return; }