/
tracie
/
Fullstack_website_2
Обзор
Документация
Войти
/
tracie
/
Fullstack_website_2
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
server.py
275 строк
11 KB
tracie
done
13 окт 2025, 07:24
13 окт 2025, 07:24
0663d06
Код
Авторство
О чём код?
from flask import Flask, render_template, request, redirect, url_for, session from werkzeug.security import generate_password_hash, check_password_hash import sqlite3 from flask import jsonify from datetime import datetime app = Flask(__name__, template_folder='pages', static_folder='static') app.secret_key = 'your_secret_key' def init_db(): conn = sqlite3.connect('AutoPro.db') cur = conn.cursor() cur.execute('DROP TABLE IF EXISTS users') cur.execute('DROP TABLE IF EXISTS orders') print("[LOG] Удаление базы данных") cur.execute(''' CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT UNIQUE NOT NULL, email TEXT UNIQUE NOT NULL, password TEXT NOT NULL ) ''') cur.execute(''' CREATE TABLE IF NOT EXISTS orders ( id INTEGER PRIMARY KEY AUTOINCREMENT, first_name TEXT, last_name TEXT, email TEXT, payment_method TEXT, card_number TEXT, card_expiry TEXT, card_cvv TEXT, services TEXT, total_cost REAL, status TEXT DEFAULT 'new', created_at TEXT ) ''') cur.execute(''' CREATE TABLE IF NOT EXISTS services ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, price INTEGER NOT NULL ) ''') services_data = [ ("Компьютерная диагностика", 5000), ("Диагностика подвески", 3500), ("Замена масла в двигателе", 2000), ("Замена масла в АКПП", 2500), ("Замена фильтров (комплекс)", 8000), ("Замена тормозных колодок", 3000), ("Замена тормозных дисков", 5000), ("Замена тормозной жидкости", 1500), ("Диагностика электрического оборудования", 2500), ("Замена аккумулятора", 2000), ("Чистка инжектора", 4000), ("Замена свечей зажигания", 3500), ("Замена ремня ГРМ", 6000), ("Замена жидкости ГУР", 4500) ] cur.executemany('INSERT INTO services (name, price) VALUES (?, ?)', services_data) print("[LOG] Инициализация базы данных") conn.commit() conn.close() init_db() @app.route('/') def index(): print(f"[LOG] Переход на главную страницу") return render_template('index.html') @app.route('/about') def about(): print(f"[LOG] Переход на страницу 'О нас'") return render_template('about.html') @app.route('/services') def services(): print(f"[LOG] Переход на страницу сервисов") return render_template('services.html') @app.route('/login', methods=['GET', 'POST']) def login(): print("[LOG] Переход на страницу авторизации") msg = '' if request.method == 'POST': username = request.form['username'] password = request.form['password'] print(f"[LOGIN] Введено имя: {username}, пароль: {password}") conn = sqlite3.connect('AutoPro.db') cur = conn.cursor() cur.execute('SELECT * FROM users WHERE username = ?', (username,)) user = cur.fetchone() conn.close() if user and check_password_hash(user[3], password): session['user_id'] = user[0] session['username'] = user[1] print(f"[LOGIN] Успешный вход. ID: {user[0]}") return redirect(url_for('index')) else: msg = 'Неверный логин или пароль' print(f"[LOGIN] Ошибка входа для пользователя: {username}") return render_template('login.html', msg=msg, show_modal=True) return render_template('login.html') @app.before_request def validate_user_session(): user_id = session.get('user_id') if user_id: conn = sqlite3.connect('AutoPro.db') cur = conn.cursor() cur.execute('SELECT id FROM users WHERE id = ?', (user_id,)) user = cur.fetchone() conn.close() if not user: print("[SECURITY] Обнаружена сессия без валидного пользователя, сбрасываем.") session.clear() @app.route('/register', methods=['GET', 'POST']) def register(): print("[LOG] Переход на страницу регистрации") msg = '' if request.method == 'POST': username = request.form['username'] email = request.form['email'] password = request.form['password'] print(f"[REGISTER] Введено имя: {username}, email: {email}, пароль: {password}") conn = sqlite3.connect('AutoPro.db') cur = conn.cursor() cur.execute('SELECT * FROM users WHERE username = ? OR email = ?', (username, email)) existing_user = cur.fetchone() if existing_user: msg = 'Пользователь с таким логином или email уже существует.' print(f"[REGISTER] Ошибка регистрации для пользователя: {username}") else: hashed_password = generate_password_hash(password) cur.execute('INSERT INTO users (username, email, password) VALUES (?, ?, ?)', (username, email, hashed_password)) conn.commit() conn.close() msg = 'Регистрация прошла успешно!' return redirect(url_for('login')) conn.close() return render_template('register.html', msg=msg) @app.route('/orders') def orders_page(): conn = sqlite3.connect('AutoPro.db') conn.row_factory = sqlite3.Row cur = conn.cursor() # Извлекаем все заказы cur.execute('SELECT * FROM orders') raw_orders = cur.fetchall() # Загружаем все доступные услуги в словарь {id: (name, price)} cur.execute('SELECT id, name, price FROM services') services_data = cur.fetchall() services_dict = {str(row['id']): (row['name'], row['price']) for row in services_data} processed_orders = [] for idx, order in enumerate(raw_orders, start=1): # Получаем строку с ID услуг и делаем её список service_ids = [s.strip() for s in order['services'].split(',')] # Преобразуем ID в названия и цены услуг service_descriptions = [] for sid in service_ids: service_name, service_price = services_dict.get(sid, ("Неизвестная услуга", 0)) service_descriptions.append((service_name, service_price)) # Сохраняем название и цену как кортежи # Добавляем порядковый номер и отформатированные услуги processed_orders.append({ 'number': idx, 'first_name': order['first_name'], 'last_name': order['last_name'], 'email': order['email'], 'payment_method': order['payment_method'], 'card_number': order['card_number'], 'card_expiry': order['card_expiry'], 'card_cvv': order['card_cvv'], 'services': service_descriptions, # Передаем кортежи с названием и ценой 'total_cost': order['total_cost'], 'created_at': order['created_at'], 'status': order['status'] }) conn.close() return render_template('orders.html', orders=processed_orders, services_dict=services_dict) @app.route('/order', methods=['POST']) def order(): data = request.get_json() created_at = datetime.now().strftime("%Y-%m-%d %H:%M") first_name = data.get('firstName') last_name = data.get('lastName') email = data.get('email') payment_method = data.get('paymentMethod') card_number = data.get('cardNumber', '') card_expiry = data.get('cardExpiry', '') card_cvv = data.get('cardCVV', '') services = ', '.join(data.get('services', [])) total_cost = data.get('totalCost') * 1000 conn = sqlite3.connect('AutoPro.db') cur = conn.cursor() # Проверяем, существует ли заказ с такими же именем, фамилией и email cur.execute(''' SELECT id FROM orders WHERE first_name = ? AND last_name = ? AND email = ? ''', (first_name, last_name, email)) existing_order = cur.fetchone() print("[ORDER] Сохраняемые данные:", first_name, last_name, email, payment_method, card_number, card_expiry, card_cvv, services, total_cost, created_at) if existing_order: # Если заказ существует, обновляем его cur.execute(''' UPDATE orders SET payment_method = ?, card_number = ?, card_expiry = ?, card_cvv = ?, services = ?, total_cost = ?, status = 'updated' WHERE id = ? ''', (payment_method, card_number, card_expiry, card_cvv, services, total_cost, existing_order[0])) conn.commit() conn.close() print("[ORDER] Заказ с такими данными найден и обновлён.") return jsonify({'message': 'Заказ с такими данными уже существует, он был обновлён!'}) else: # Если заказа нет, добавляем новый cur.execute(''' INSERT INTO orders ( first_name, last_name, email, payment_method, card_number, card_expiry, card_cvv, services, total_cost, created_at ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ''', ( first_name, last_name, email, payment_method, card_number, card_expiry, card_cvv, services, total_cost, created_at )) conn.commit() conn.close() print("[ORDER] Заказ успешно сохранён в базу данных.") return jsonify({'message': 'Заказ успешно оформлен!'}) @app.route('/logout') def logout(): print(f"[LOGOUT] Пользователь {session.get('username')} вышел из системы.") session.clear() return redirect(url_for('index')) if __name__ == '__main__': app.run(debug=True)