Загрузка данных
booking.php
<?php
require_once 'config/database.php';
include 'includes/header.php';
if(!isset($_SESSION['user_id'])) { echo '<div class="alert warn"> Для бронирования <a href="profile.php">войдите</a></div>'; include 'includes/footer.php'; exit; }
$room_id=(int)$_GET['id'];
if(!$room_id) { echo '<div class="alert error"> Ошибка: помещение не выбрано</div>'; include 'includes/footer.php'; exit; }
$room=$pdo->prepare("SELECT * FROM rooms WHERE id=?");
$room->execute([$room_id]);
$room=$room->fetch();
if(!$room) { echo '<div class="alert error">Ошибка: помещение не найдено</div>'; include 'includes/footer.php'; exit; }
$user=$pdo->prepare("SELECT * FROM users WHERE id=?");
$user->execute([$_SESSION['user_id']]);
$user=$user->fetch();
$msg='';
if($_POST && isset($_POST['submit'])) {
$date=$_POST['date']; $start=$_POST['start']; $end=$_POST['end']; $purpose=trim($_POST['purpose']); $days=(int)$_POST['days'];
$total=$room['price_per_day']*$days;
if(empty($date)||empty($start)||empty($end)||empty($purpose)) $msg='<div class="alert error">Заполните все поля</div>';
elseif($days<1) $msg='<div class="alert error">Дней не менее 1</div>';
else {
$book=$pdo->prepare("INSERT INTO bookings (user_id,room_id,booking_date,start_time,end_time,purpose,total_price) VALUES (?,?,?,?,?,?,?)");
$book->execute([$_SESSION['user_id'],$room_id,$date,$start,$end,$purpose,$total]);
$msg='<div class="alert success"> Заявка создана! <a href="my-bookings.php">Мои заявки</a> | <a href="rooms.php">Назад</a></div>';
unset($_POST);
}
}
$types=['auditorium'=>'Аудитория','coworking'=>'Коворкинг','cinema'=>'Кинозал'];
?>
<h1>Бронирование</h1>
<?=$msg?>
<div style="display:grid;grid-template-columns:1fr 1fr;gap:30px;">
<div style="background:#fff;border-radius:12px;overflow:hidden;box-shadow:0 2px 15px rgba(0,0,0,0.08);">
<img src="<?=$room['image_url']?>" style="width:100%;height:300px;object-fit:cover;">
<div style="padding:25px;">
<div style="display:flex;justify-content:space-between;margin-bottom:15px;">
<span class="type"><?=$types[$room['type']]??$room['type']?></span>
<span style="background:#fff3e0;color:#e65100;padding:4px 12px;border-radius:20px;font-size:12px;"> <?=$room['capacity']?> чел.</span>
</div>
<h2 style="color:#1a237e;font-size:28px;"><?=htmlspecialchars($room['name'])?></h2>
<p style="color:#666;line-height:1.8;"><?=nl2br(htmlspecialchars($room['description']))?></p>
<div style="background:#f5f7fa;border-radius:8px;padding:15px;margin-top:15px;">
<div style="display:flex;justify-content:space-between;padding:5px 0;border-bottom:1px solid #ddd;"> <b><?=number_format($room['price_per_day'],0)?> ₽/день</b></div>
<div style="display:flex;justify-content:space-between;padding:5px 0;"> <?=$types[$room['type']]??$room['type']?></div>
</div>
</div>
</div>
<div style="background:#fff;border-radius:12px;padding:30px;box-shadow:0 2px 15px rgba(0,0,0,0.08);">
<h3> Данные пользователя</h3>
<div style="background:#f5f7fa;border-radius:8px;padding:15px;margin:15px 0;">
<div style="display:flex;justify-content:space-between;padding:5px 0;border-bottom:1px solid #ddd;">Имя: <b><?=htmlspecialchars($user['full_name'])?></b></div>
<div style="display:flex;justify-content:space-between;padding:5px 0;border-bottom:1px solid #ddd;">Email: <b><?=htmlspecialchars($user['email'])?></b></div>
<div style="display:flex;justify-content:space-between;padding:5px 0;">Телефон: <b><?=htmlspecialchars($user['phone']??'Не указан')?></b></div>
</div>
<form method="POST">
<input type="date" name="date" required style="width:100%;padding:10px;margin:5px 0;border:1px solid #ddd;border-radius:6px;box-sizing:border-box;">
<div style="display:grid;grid-template-columns:1fr 1fr;gap:10px;">
<input type="time" name="start" required style="padding:10px;border:1px solid #ddd;border-radius:6px;box-sizing:border-box;">
<input type="time" name="end" required style="padding:10px;border:1px solid #ddd;border-radius:6px;box-sizing:border-box;">
</div>
<input type="number" name="days" id="days" value="1" min="1" required style="width:100%;padding:10px;margin:5px 0;border:1px solid #ddd;border-radius:6px;box-sizing:border-box;">
<textarea name="purpose" rows="3" required style="width:100%;padding:10px;margin:5px 0;border:1px solid #ddd;border-radius:6px;box-sizing:border-box;resize:vertical;" placeholder="Цель мероприятия"></textarea>
<div style="background:#f5f7fa;border-radius:8px;padding:15px;margin:10px 0;">
<div style="display:flex;justify-content:space-between;padding:5px 0;border-bottom:1px solid #ddd;">Дней: <span id="daysDisplay">1</span></div>
<div style="display:flex;justify-content:space-between;padding:5px 0;font-size:20px;font-weight:700;">Итого: <span style="color:#2e7d32;" id="totalPrice"><?=number_format($room['price_per_day'],0)?> ₽</span></div>
</div>
<button type="submit" name="submit" class="btn btn-success" style="width:100%;padding:14px;font-size:16px;"> Отправить заявку</button>
<div style="text-align:center;margin-top:10px;"><a href="rooms.php" style="color:#1a237e;">← Назад</a></div>
</form>
</div>
</div>
<script>
document.getElementById('days').oninput=function(){
let d=parseInt(this.value)||0;
document.getElementById('daysDisplay').textContent=d;
document.getElementById('totalPrice').textContent=(d>0?d*<?=$room['price_per_day']?>:0)+' ₽';
};
</script>
<?php include 'includes/footer.php'; ?>
database config.php
<?php
$host = 'localhost';
$dbname = 'conference_rf';
$username = 'root';
$password = '';
try {
$pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
die("Ошибка подключения: " . $e->getMessage());
}
session_start();
rooms.php
<?php
require_once 'config/database.php';
include 'includes/header.php';
$stmt = $pdo->query("SELECT * FROM rooms ORDER BY id");
$rooms = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>
<h1 style="margin-bottom: 30px;">Все помещения</h1>
<div class="rooms-grid">
<?php foreach ($rooms as $room): ?>
<div class="room-card" id="room-<?= $room['id'] ?>">
<img src="<?= $room['image_url'] ?>" alt="<?= $room['name'] ?>">
<div class="card-body">
<span class="type">
<?php
$types = ['auditorium' => 'Аудитория', 'coworking' => 'Коворкинг', 'cinema' => 'Кинозал'];
echo $types[$room['type']] ?? $room['type'];
?>
</span>
<h3><?= $room['name'] ?></h3>
<p><?= $room['description'] ?></p>
<div style="margin:10px 0;color:#666;font-size:14px;">
Вместимость: <?= $room['capacity'] ?> человек
</div>
<div class="price"><?= number_format($room['price_per_day'], 0) ?> ₽/день</div>
<a href="booking.php?id=<?= $room['id'] ?>" class="btn btn-success">Забронировать</a>
</div>
</div>
<?php endforeach; ?>
</div>
<?php include 'includes/footer.php'; ?>
profile.php
profile.php
<?php
require_once 'config/database.php';
include 'includes/header.php';
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['register'])) {
$username = $_POST['username'];
$email = $_POST['email'];
$password = password_hash($_POST['password'], PASSWORD_DEFAULT);
$full_name = $_POST['full_name'];
$phone = $_POST['phone'] ?? '';
try {
$stmt = $pdo->prepare("INSERT INTO users (username, email, password, full_name, phone) VALUES (?, ?, ?, ?, ?)");
$stmt->execute([$username, $email, $password, $full_name, $phone]);
$user_id = $pdo->lastInsertId();
$_SESSION['user_id'] = $user_id;
$_SESSION['username'] = $username;
$_SESSION['is_admin'] = ($username === 'Admin26');
echo '<div style="background:#e8f5e9;padding:15px;border-radius:8px;margin-bottom:20px;">Регистрация успешна! Вы автоматически вошли в аккаунт.</div>';
$user_stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
$user_stmt->execute([$user_id]);
$user_data = $user_stmt->fetch(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
echo '<div style="background:#ffebee;padding:15px;border-radius:8px;margin-bottom:20px;">❌ Ошибка: такой пользователь или email уже существует</div>';
}
}
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['login'])) {
$username = $_POST['username'];
$password = $_POST['password'];
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ? OR email = ?");
$stmt->execute([$username, $username]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
if ($user && password_verify($password, $user['password'])) {
$_SESSION['user_id'] = $user['id'];
$_SESSION['username'] = $user['username'];
$_SESSION['is_admin'] = ($user['username'] === 'Admin26');
header('Location: profile.php');
exit;
} else {
echo '<div style="background:#ffebee;padding:15px;border-radius:8px;margin-bottom:20px;">❌ Неверный логин или пароль</div>';
}
}
?>
<?php if (isset($_SESSION['user_id'])):
if (!isset($user_data)) {
$user_stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
$user_stmt->execute([$_SESSION['user_id']]);
$user_data = $user_stmt->fetch(PDO::FETCH_ASSOC);
}
?>
<div style="background:white;padding:30px;border-radius:12px;max-width:500px;margin:0 auto;">
<h2 style="color:#1a237e;margin-bottom:25px;">Профиль</h2>
<div style="display:grid;gap:15px;">
<div style="display:flex;justify-content:space-between;padding:10px 0;border-bottom:1px solid #f0f0f0;">
<span style="color:#666;">Имя:</span>
<span style="font-weight:500;"><?= htmlspecialchars($user_data['full_name']) ?></span>
</div>
<div style="display:flex;justify-content:space-between;padding:10px 0;border-bottom:1px solid #f0f0f0;">
<span style="color:#666;">Логин:</span>
<span style="font-weight:500;"><?= htmlspecialchars($user_data['username']) ?></span>
</div>
<div style="display:flex;justify-content:space-between;padding:10px 0;border-bottom:1px solid #f0f0f0;">
<span style="color:#666;">Email:</span>
<span style="font-weight:500;"><?= htmlspecialchars($user_data['email']) ?></span>
</div>
<div style="display:flex;justify-content:space-between;padding:10px 0;border-bottom:1px solid #f0f0f0;">
<span style="color:#666;">Телефон:</span>
<span style="font-weight:500;"><?= htmlspecialchars($user_data['phone'] ?? 'Не указан') ?></span>
</div>
<div style="display:flex;justify-content:space-between;padding:10px 0;">
<span style="color:#666;">Роль:</span>
<span style="font-weight:500;"><?= $_SESSION['is_admin'] ? 'Администратор' : 'Пользователь' ?></span>
</div>
</div>
<div style="margin-top:25px;display:flex;gap:10px;">
<a href="logout.php" class="btn btn-danger">Выйти</a>
<?php if ($_SESSION['is_admin']): ?>
<a href="admin.php" class="btn">Админ-панель</a>
<?php endif; ?>
</div>
</div>
<?php else: ?>
<div style="display:grid;grid-template-columns:1fr 1fr;gap:30px;max-width:900px;margin:0 auto;">
<!-- Вход -->
<div class="auth-form">
<h2>Вход</h2>
<form method="POST">
<input type="text" name="username" placeholder="Логин или Email" required>
<input type="password" name="password" placeholder="Пароль" required>
<button type="submit" name="login" class="btn">Войти</button>
</form>
</div>
<div class="auth-form">
<h2>Регистрация</h2>
<form method="POST">
<input type="text" name="username" placeholder="Логин" required>
<input type="email" name="email" placeholder="Email" required>
<input type="text" name="full_name" placeholder="Полное имя" required>
<input type="tel" name="phone" placeholder="Телефон (необязательно)">
<input type="password" name="password" placeholder="Пароль" required>
<button type="submit" name="register" class="btn btn-success">Зарегистрироваться</button>
</form>
</div>
</div>
<?php endif; ?>
<?php include 'includes/footer.php'; ?>
my-bookings.php
<?php
require_once 'config/database.php';
include 'includes/header.php';
if (!isset($_SESSION['user_id'])) {
echo '<div style="background:#fff3e0;padding:20px;border-radius:8px;">⚠️ Пожалуйста, <a href="profile.php">войдите</a> для просмотра заявок</div>';
include 'includes/footer.php';
exit;
}
$stmt = $pdo->prepare("
SELECT b.*, r.name as room_name, r.type
FROM bookings b
JOIN rooms r ON b.room_id = r.id
WHERE b.user_id = ?
ORDER BY b.created_at DESC
");
$stmt->execute([$_SESSION['user_id']]);
$bookings = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>
<h1 style="margin-bottom: 30px;">Мои заявки</h1>
<?php if (count($bookings) === 0): ?>
<div style="background:white;padding:40px;border-radius:12px;text-align:center;">
<p style="font-size:18px;color:#666;">У вас пока нет заявок</p>
<a href="rooms.php" class="btn" style="margin-top:20px;">Перейти к помещениям</a>
</div>
<?php else: ?>
<div class="bookings-list">
<?php foreach ($bookings as $booking): ?>
<div class="booking-item">
<div>
<strong><?= $booking['room_name'] ?></strong> (<?= $booking['type'] ?>)<br>
<small>Дата: <?= date('d.m.Y', strtotime($booking['booking_date'])) ?></small><br>
<small>Сумма: <?= number_format($booking['total_price'], 0) ?> ₽</small>
</div>
<div style="text-align:right;">
<span class="status status-<?= $booking['status'] ?>">
<?php
$statuses = ['new' => 'Новая', 'assigned' => 'Мероприятие назначено', 'completed' => 'Мероприятие завершено'];
echo $statuses[$booking['status']];
?>
</span>
</div>
</div>
<?php endforeach; ?>
</div>
<?php endif; ?>
<?php include 'includes/footer.php'; ?>
logout.php
<?php
session_start();
session_destroy();
header('Location: index.php');
exit;
index.php
<?php
require_once 'config/database.php';
?>
<?php include 'includes/header.php'; ?>
<div class="hero">
<h1>Конференции.РФ</h1>
<p>
</p>
</div>
<div class="slider">
<?php
$slides = [
['img' => 'https://tse1.mm.bing.net/th/id/OIP.ESWwWDUX3xEVex6qHR_ZvgHaEn?rs=1&pid=ImgDetMain&o=7&rm=3', 'title' => 'Аудитория "Наука"', 'desc' => 'Современное оборудование для научных конференций'],
['img' => 'https://picsum.photos/id/20/1200/400', 'title' => 'Коворкинг "Инноватор"', 'desc' => 'Пространство для вдохновения и работы'],
['img' => 'https://picsum.photos/id/30/1200/400', 'title' => 'Кинозал "Премиум"', 'desc' => 'Профессиональный кинозал с 3D-проектором']
];
foreach ($slides as $index => $slide): ?>
<div class="slider-slide <?= $index === 0 ? 'active' : '' ?>">
<img src="<?= $slide['img'] ?>" alt="<?= $slide['title'] ?>">
<div class="slider-content">
<h3><?= $slide['title'] ?></h3>
<p><?= $slide['desc'] ?></p>
</div>
</div>
<?php endforeach; ?>
</div>
<h2 style="margin-bottom: 20px;">Популярные помещения</h2>
<div class="rooms-grid">
<?php
$stmt = $pdo->query("SELECT * FROM rooms LIMIT 3");
while ($room = $stmt->fetch(PDO::FETCH_ASSOC)):
?>
<div class="room-card">
<img src="<?= $room['image_url'] ?>" alt="<?= $room['name'] ?>">
<div class="card-body">
<span class="type"><?= $room['type'] ?></span>
<h3><?= $room['name'] ?></h3>
<p><?= substr($room['description'], 0, 80) ?>...</p>
<div class="price"><?= number_format($room['price_per_day'], 0) ?> ₽/день</div>
<a href="rooms.php#room-<?= $room['id'] ?>" class="btn">Подробнее</a>
</div>
</div>
<?php endwhile; ?>
</div>
<?php include 'includes/footer.php'; ?>
admin.php
<?php
require_once 'config/database.php';
include 'includes/header.php';
if (!isset($_SESSION['is_admin']) || !$_SESSION['is_admin']) {
header('Location: profile.php');
exit;
}
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['update_status'])) {
$booking_id = (int)$_POST['booking_id'];
$status = $_POST['status'];
$stmt = $pdo->prepare("UPDATE bookings SET status = ? WHERE id = ?");
$stmt->execute([$status, $booking_id]);
header('Location: admin.php');
exit;
}
$stmt = $pdo->query("
SELECT b.*, u.username, u.full_name, r.name as room_name
FROM bookings b
JOIN users u ON b.user_id = u.id
JOIN rooms r ON b.room_id = r.id
ORDER BY b.created_at DESC
");
$bookings = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>
<h1 style="margin-bottom: 30px;">Админ-панель</h1>
<div class="admin-panel">
<h3>Управление заявками</h3>
<table>
<thead>
<tr>
<th>ID</th>
<th>Пользователь</th>
<th>Помещение</th>
<th>Дата</th>
<th>Сумма</th>
<th>Статус</th>
<th>Действие</th>
</tr>
</thead>
<tbody>
<?php foreach ($bookings as $booking): ?>
<tr>
<td>#<?= $booking['id'] ?></td>
<td><?= htmlspecialchars($booking['full_name']) ?></td>
<td><?= $booking['room_name'] ?></td>
<td><?= date('d.m.Y', strtotime($booking['booking_date'])) ?></td>
<td><?= number_format($booking['total_price'], 0) ?> ₽</td>
<td>
<span class="status status-<?= $booking['status'] ?>">
<?php
$statuses = ['new' => 'Новая', 'assigned' => 'Мероприятие назначено', 'completed' => 'Мероприятие завершено'];
echo $statuses[$booking['status']];
?>
</span>
</td>
<td>
<form method="POST" style="display:inline;">
<input type="hidden" name="booking_id" value="<?= $booking['id'] ?>">
<select name="status" class="status-select" data-booking-id="<?= $booking['id'] ?>">
<option value="new" <?= $booking['status'] === 'new' ? 'selected' : '' ?>>Новая</option>
<option value="assigned" <?= $booking['status'] === 'assigned' ? 'selected' : '' ?>>Мероприятие назначено</option>
<option value="completed" <?= $booking['status'] === 'completed' ? 'selected' : '' ?>>Мероприятие завершено</option>
</select>
<button type="submit" name="update_status" class="btn" style="padding:5px 12px;font-size:12px;">Обновить</button>
</form>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
<?php include 'includes/footer.php'; ?>
js/script.js
document.addEventListener('DOMContentLoaded', function() {
// Слайдер на главной
const slides = document.querySelectorAll('.slider-slide');
let currentSlide = 0;
function showSlide(index) {
slides.forEach((slide, i) => {
slide.classList.toggle('active', i === index);
});
}
if (slides.length > 0) {
showSlide(0);
setInterval(() => {
currentSlide = (currentSlide + 1) % slides.length;
showSlide(currentSlide);
}, 3000);
}
const statusSelects = document.querySelectorAll('.status-select');
statusSelects.forEach(select => {
select.addEventListener('change', function() {
const bookingId = this.dataset.bookingId;
const status = this.value;
fetch('admin.php', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body: `update_status=true&booking_id=${bookingId}&status=${status}`
})
.then(response => response.json())
.then(data => {
if (data.success) {
location.reload();
}
});
});
});
// Расчет стоимости при бронировании
const pricePerDay = document.querySelector('.room-price')?.dataset.price;
const daysInput = document.getElementById('days');
const totalPrice = document.getElementById('total-price');
if (daysInput && totalPrice && pricePerDay) {
daysInput.addEventListener('input', function() {
const days = parseInt(this.value) || 1;
totalPrice.textContent = (pricePerDay * days).toFixed(2);
});
}
});
includes/footer.php
</div>
</main>
<footer>
<div class="container">
<p>Адрес:</p>
<p>Номер телефона::</p>
</div>
</footer>
<script src="js/script.js"></script>
</body>
</html>
header.php
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Конференции.РФ</title>
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<header>
<div class="container">
<div class="logo">
<a href="index.php">Конференции.РФ</a>
</div>
<nav>
<a href="index.php">Главная</a>
<a href="rooms.php">Помещения</a>
<a href="my-bookings.php">Мои заявки</a>
<a href="profile.php">Профиль</a>
</nav>
</div>
</header>
<main>
<div class="container">
config database.php
<?php
$host = 'localhost';
$dbname = 'conference_rf';
$username = 'root';
$password = '';
try {
$pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
die("Ошибка подключения: " . $e->getMessage());
}
session_start();
css/style.css
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html, body {
height: 100%;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;
background: #f5f7fa;
color: #2c3e50;
line-height: 1.6;
}
body {
display: flex;
flex-direction: column;
min-height: 100vh;
}
.container {
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
width: 100%;
}
/* ===== ШАПКА ===== */
header {
background: #1a237e;
color: white;
padding: 15px 0;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
position: sticky;
top: 0;
z-index: 1000;
width: 100%;
flex-shrink: 0;
}
header .container {
display: flex;
justify-content: space-between;
align-items: center;
flex-wrap: wrap;
}
header .logo a {
color: white;
text-decoration: none;
font-size: 24px;
font-weight: 700;
white-space: nowrap;
}
header nav {
display: flex;
flex-wrap: wrap;
gap: 5px;
}
header nav a {
color: rgba(255,255,255,0.9);
text-decoration: none;
padding: 8px 16px;
border-radius: 4px;
transition: background 0.3s;
font-size: 15px;
white-space: nowrap;
}
header nav a:hover {
background: rgba(255,255,255,0.15);
color: white;
}
/* ===== ОСНОВНОЙ КОНТЕНТ ===== */
main {
flex: 1 0 auto;
padding: 40px 0;
width: 100%;
}
/* ===== ПОДВАЛ ===== */
footer {
background: #1a237e;
color: white;
padding: 20px 0;
text-align: center;
width: 100%;
flex-shrink: 0;
margin-top: auto;
}
footer .container {
padding: 0 20px;
}
/* ===== ОСТАЛЬНЫЕ СТИЛИ ===== */
.hero {
background: linear-gradient(135deg, #1a237e 0%, #0d47a1 100%);
color: white;
padding: 60px;
border-radius: 12px;
margin-bottom: 40px;
text-align: center;
}
.hero h1 {
font-size: 42px;
margin-bottom: 15px;
}
.hero p {
font-size: 18px;
opacity: 0.9;
max-width: 600px;
margin: 0 auto;
}
.slider {
position: relative;
height: 400px;
overflow: hidden;
border-radius: 12px;
margin-bottom: 40px;
background: #e0e0e0;
}
.slider-slide {
position: absolute;
width: 100%;
height: 100%;
opacity: 0;
transition: opacity 0.8s;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
color: white;
padding: 40px;
}
.slider-slide.active {
opacity: 1;
}
.slider-slide img {
width: 100%;
height: 100%;
object-fit: cover;
position: absolute;
top: 0;
left: 0;
}
.slider-content {
position: relative;
z-index: 2;
background: rgba(0,0,0,0.6);
padding: 30px;
border-radius: 8px;
text-align: center;
max-width: 600px;
}
.slider-content h3 {
font-size: 28px;
margin-bottom: 10px;
}
.rooms-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 25px;
margin-top: 30px;
}
.room-card {
background: white;
border-radius: 12px;
overflow: hidden;
box-shadow: 0 2px 15px rgba(0,0,0,0.08);
transition: transform 0.3s, box-shadow 0.3s;
}
.room-card:hover {
transform: translateY(-5px);
box-shadow: 0 5px 25px rgba(0,0,0,0.15);
}
.room-card img {
width: 100%;
height: 200px;
object-fit: cover;
}
.room-card .card-body {
padding: 20px;
}
.room-card h3 {
font-size: 20px;
margin-bottom: 10px;
color: #1a237e;
}
.room-card .type {
display: inline-block;
background: #e8eaf6;
color: #1a237e;
padding: 4px 12px;
border-radius: 20px;
font-size: 12px;
margin-bottom: 10px;
}
.room-card .price {
font-size: 20px;
font-weight: 700;
color: #2e7d32;
margin: 10px 0;
}
.btn {
display: inline-block;
padding: 10px 24px;
background: #1a237e;
color: white;
text-decoration: none;
border-radius: 6px;
border: none;
cursor: pointer;
transition: background 0.3s;
font-size: 14px;
}
.btn:hover {
background: #0d47a1;
}
.btn-success {
background: #2e7d32;
}
.btn-success:hover {
background: #1b5e20;
}
.btn-danger {
background: #c62828;
}
.btn-danger:hover {
background: #b71c1c;
}
.auth-form {
max-width: 400px;
margin: 0 auto;
background: white;
padding: 40px;
border-radius: 12px;
box-shadow: 0 2px 15px rgba(0,0,0,0.1);
}
.auth-form h2 {
margin-bottom: 25px;
color: #1a237e;
text-align: center;
}
.auth-form input {
width: 100%;
padding: 12px;
margin-bottom: 15px;
border: 1px solid #ddd;
border-radius: 6px;
font-size: 14px;
box-sizing: border-box;
}
.auth-form .btn {
width: 100%;
padding: 12px;
font-size: 16px;
}
.bookings-list {
background: white;
border-radius: 12px;
overflow: hidden;
box-shadow: 0 2px 15px rgba(0,0,0,0.08);
}
.booking-item {
padding: 20px;
border-bottom: 1px solid #f0f0f0;
display: flex;
justify-content: space-between;
align-items: center;
flex-wrap: wrap;
gap: 10px;
}
.booking-item:last-child {
border-bottom: none;
}
.status {
padding: 4px 12px;
border-radius: 20px;
font-size: 12px;
font-weight: 600;
display: inline-block;
}
.status-new {
background: #fff3e0;
color: #e65100;
}
.status-assigned {
background: #e3f2fd;
color: #0d47a1;
}
.status-completed {
background: #e8f5e9;
color: #1b5e20;
}
.admin-panel {
background: white;
border-radius: 12px;
padding: 30px;
box-shadow: 0 2px 15px rgba(0,0,0,0.08);
overflow-x: auto;
}
.admin-panel table {
width: 100%;
border-collapse: collapse;
min-width: 600px;
}
.admin-panel th {
background: #f5f7fa;
padding: 12px;
text-align: left;
font-weight: 600;
}
.admin-panel td {
padding: 12px;
border-bottom: 1px solid #f0f0f0;
}
.admin-panel select {
padding: 6px 12px;
border-radius: 4px;
border: 1px solid #ddd;
}
/* ===== АДАПТИВ ===== */
@media (max-width: 768px) {
header .container {
flex-direction: column;
gap: 10px;
align-items: center;
}
header nav {
justify-content: center;
}
header nav a {
padding: 6px 12px;
font-size: 14px;
}
.hero h1 {
font-size: 28px;
}
.hero {
padding: 30px 20px;
}
.slider {
height: 300px;
}
.slider-content {
padding: 15px;
}
.slider-content h3 {
font-size: 20px;
}
.rooms-grid {
grid-template-columns: 1fr;
}
.booking-item {
flex-direction: column;
align-items: flex-start;
}
.auth-form {
padding: 20px;
margin: 0 10px;
}
}
@media (max-width: 480px) {
header .logo a {
font-size: 18px;
}
header nav a {
font-size: 12px;
padding: 4px 10px;
}
.slider {
height: 250px;
}
.admin-panel {
padding: 15px;
}
}
my-bookings.php
<?php
require_once 'config/database.php';
include 'includes/header.php';
if (!isset($_SESSION['user_id'])) {
echo '<div style="background:#fff3e0;padding:20px;border-radius:8px;">⚠️ Пожалуйста, <a href="profile.php">войдите</a> для просмотра заявок</div>';
include 'includes/footer.php';
exit;
}
$stmt = $pdo->prepare("
SELECT b.*, r.name as room_name, r.type
FROM bookings b
JOIN rooms r ON b.room_id = r.id
WHERE b.user_id = ?
ORDER BY b.created_at DESC
");
$stmt->execute([$_SESSION['user_id']]);
$bookings = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>
<h1 style="margin-bottom: 30px;">Мои заявки</h1>
<?php if (count($bookings) === 0): ?>
<div style="background:white;padding:40px;border-radius:12px;text-align:center;">
<p style="font-size:18px;color:#666;">У вас пока нет заявок</p>
<a href="rooms.php" class="btn" style="margin-top:20px;">Перейти к помещениям</a>
</div>
<?php else: ?>
<div class="bookings-list">
<?php foreach ($bookings as $booking): ?>
<div class="booking-item">
<div>
<strong><?= $booking['room_name'] ?></strong> (<?= $booking['type'] ?>)<br>
<small>Дата: <?= date('d.m.Y', strtotime($booking['booking_date'])) ?></small><br>
<small>Сумма: <?= number_format($booking['total_price'], 0) ?> ₽</small>
</div>
<div style="text-align:right;">
<span class="status status-<?= $booking['status'] ?>">
<?php
$statuses = ['new' => 'Новая', 'assigned' => 'Мероприятие назначено', 'completed' => 'Мероприятие завершено'];
echo $statuses[$booking['status']];
?>
</span>
</div>
</div>
<?php endforeach; ?>
</div>
<?php endif; ?>
<?php include 'includes/footer.php'; ?>
admin.php
<?php
require_once 'config/database.php';
include 'includes/header.php';
if (!isset($_SESSION['is_admin']) || !$_SESSION['is_admin']) {
header('Location: profile.php');
exit;
}
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['update_status'])) {
$booking_id = (int)$_POST['booking_id'];
$status = $_POST['status'];
$stmt = $pdo->prepare("UPDATE bookings SET status = ? WHERE id = ?");
$stmt->execute([$status, $booking_id]);
header('Location: admin.php');
exit;
}
$stmt = $pdo->query("
SELECT b.*, u.username, u.full_name, r.name as room_name
FROM bookings b
JOIN users u ON b.user_id = u.id
JOIN rooms r ON b.room_id = r.id
ORDER BY b.created_at DESC
");
$bookings = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>
<h1 style="margin-bottom: 30px;">Админ-панель</h1>
<div class="admin-panel">
<h3>Управление заявками</h3>
<table>
<thead>
<tr>
<th>ID</th>
<th>Пользователь</th>
<th>Помещение</th>
<th>Дата</th>
<th>Сумма</th>
<th>Статус</th>
<th>Действие</th>
</tr>
</thead>
<tbody>
<?php foreach ($bookings as $booking): ?>
<tr>
<td>#<?= $booking['id'] ?></td>
<td><?= htmlspecialchars($booking['full_name']) ?></td>
<td><?= $booking['room_name'] ?></td>
<td><?= date('d.m.Y', strtotime($booking['booking_date'])) ?></td>
<td><?= number_format($booking['total_price'], 0) ?> ₽</td>
<td>
<span class="status status-<?= $booking['status'] ?>">
<?php
$statuses = ['new' => 'Новая', 'assigned' => 'Мероприятие назначено', 'completed' => 'Мероприятие завершено'];
echo $statuses[$booking['status']];
?>
</span>
</td>
<td>
<form method="POST" style="display:inline;">
<input type="hidden" name="booking_id" value="<?= $booking['id'] ?>">
<select name="status" class="status-select" data-booking-id="<?= $booking['id'] ?>">
<option value="new" <?= $booking['status'] === 'new' ? 'selected' : '' ?>>Новая</option>
<option value="assigned" <?= $booking['status'] === 'assigned' ? 'selected' : '' ?>>Мероприятие назначено</option>
<option value="completed" <?= $booking['status'] === 'completed' ? 'selected' : '' ?>>Мероприятие завершено</option>
</select>
<button type="submit" name="update_status" class="btn" style="padding:5px 12px;font-size:12px;">Обновить</button>
</form>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
<?php include 'includes/footer.php'; ?>