File manager - Edit - /var/www/order.cmtc.ac.th/index.php
Back
<?php session_start(); include('config/db.php'); include('includes/check_timer.php'); // ✅ ตรวจสอบว่ามี session การชำระเงินค้างอยู่หรือไม่ $checkout_locked = false; if (isset($_SESSION['checkout_expire']) && time() < $_SESSION['checkout_expire']) { $checkout_locked = true; // ยังอยู่ในระยะเวลาชำระเงิน } // ✅ ตรวจสอบว่ามีเวลานับถอยหลังจาก checkout.php หรือไม่ $checkout_active = false; if (isset($_SESSION['checkout_expire'])) { if (time() < $_SESSION['checkout_expire']) { $checkout_active = true; } else { // ถ้าหมดเวลาแล้วให้ล้างค่า unset($_SESSION['checkout_expire']); } } // -------------------------- // ระบบนับจำนวนผู้ใช้ออนไลน์ (Lightweight) // -------------------------- $session_id = session_id(); $user_ip = $_SERVER['REMOTE_ADDR']; $time = time(); $timeout = $time - 300; // 5 นาที $conn->query("REPLACE INTO user_online (session_id, ip_address, last_activity) VALUES ('$session_id', '$user_ip', $time)"); $conn->query("DELETE FROM user_online WHERE last_activity < $timeout"); $res = $conn->query("SELECT COUNT(*) AS total FROM user_online"); $row = $res->fetch_assoc(); $online_users = $row['total']; // -------------------------- // ✅ ดึงสถานะระบบจอง $setting_booking = $conn->query("SELECT setting_value FROM settings WHERE setting_key='booking_status'")->fetch_assoc(); $booking_status = $setting_booking['setting_value'] ?? 'on'; // ✅ ดึงสถานะ Pre Order $setting_preorder = $conn->query("SELECT setting_value FROM settings WHERE setting_key='pre_order_status'")->fetch_assoc(); $pre_order_status = $setting_preorder['setting_value'] ?? 'off'; // ✅ หากระบบจองถูกปิด ให้ล้างสินค้าในตะกร้า if ($booking_status == 'off' && isset($_SESSION['cart'])) { unset($_SESSION['cart']); } // ✅ ดึงรายการสินค้า $products = $conn->query("SELECT * FROM products ORDER BY id ASC"); // ✅ เพิ่มสินค้าเข้าตะกร้า (เฉพาะตอนเปิดระบบจอง) if ($booking_status == 'on' && isset($_GET['add_cart'])) { $pid = intval($_GET['add_cart']); $prod = $conn->query("SELECT stock FROM products WHERE id=$pid")->fetch_assoc(); if ($prod) { if ($prod['stock'] > 0 || $pre_order_status == 'on') { if (!isset($_SESSION['cart'][$pid])) { $_SESSION['cart'][$pid] = 1; } else { $_SESSION['cart'][$pid]++; } header("Location: index.php?cart_added=1"); exit; } else { header("Location: index.php?out_of_stock=1"); exit; } } } // ✅ นับจำนวนสินค้าในตะกร้า $cart_count = 0; if (isset($_SESSION['cart'])) { foreach ($_SESSION['cart'] as $qty) { $cart_count += $qty; } } ?> <?php include('includes/timer_bar.php'); ?> <!DOCTYPE html> <html lang="th"> <head> <meta charset="UTF-8"> <title><?=$system_name?> <?=$coin_name?> <?=$school_name?></title> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet"> <link href="https://cdn.jsdelivr.net/npm/lightbox2@2.11.4/dist/css/lightbox.min.css" rel="stylesheet"> <link href="https://fonts.googleapis.com/css2?family=Kanit:wght@300;400;500;600;700&display=swap" rel="stylesheet"> <style> body { font-family:'Kanit',sans-serif;background-color:#faf7f2; } .navbar { background: linear-gradient(45deg,#44000E,#44000E); } .navbar-brand { font-weight:600;color:#fff!important;font-size:1.3rem; } .btn-gold { background:linear-gradient(45deg,#c9a23f,#ffca28);color:#000;font-weight:600;border:none; } .btn-gold:hover { background:linear-gradient(45deg,#ffca28,#d4af37); } .badge-cart { background:#ffcc00;color:#000;font-size:13px;margin-left:5px;border-radius:10px;padding:2px 7px; } footer { background-color:#44000E;color:#f5f5f5;text-align:center;padding:20px 10px;margin-top:50px; } .hero { background:url('images/temple_bg.jpg') center/cover no-repeat;color:white;text-align:center;padding:100px 15px;position:relative;overflow:hidden; } .hero::after { content:'';position:absolute;inset:0;background:rgba(0,0,0,0.55); } .hero-content { position:relative;z-index:2; } .hero h1 { font-size:2.6rem;font-weight:700;color:#ffd54f;text-shadow:0 0 15px rgba(255,215,0,0.9);animation:glowText 3s infinite alternate; } @keyframes glowText { from{ text-shadow:0 0 10px rgba(255,215,0,0.5);} to{ text-shadow:0 0 25px rgba(255,235,59,1);} } .card { border:none;border-radius:16px;box-shadow:0 2px 6px rgba(0,0,0,0.1);transition:.3s;position:relative;overflow:hidden; } .card:hover { transform:translateY(-6px);box-shadow:0 8px 16px rgba(0,0,0,0.15); } .hover-card { transition:all 0.3s ease;border:1px solid #eee;border-radius:12px; } .hover-card:hover { transform:translateY(-5px);box-shadow:0 6px 14px rgba(0,0,0,0.15); } .stock-info { display:flex;justify-content:space-between;font-size:0.9rem;margin-top:4px; } .stock-left { color:#0d6efd;font-weight:600; } .stock-right { color:#fd7e14;font-weight:600; } .progress { height:6px;border-radius:6px;background-color:#e9ecef;margin-top:6px;overflow:hidden; } .progress-bar { transition:width 0.6s ease; } /* ✅ ผู้ใช้งานออนไลน์ */ .online-counter { color:#ffeb3b;font-size:0.9rem;font-weight:500;margin-right:10px; } /* ✅ ป้าย Ribbon (Pre Order + Sold Out) */ .ribbon { position: absolute; top: 10px; right: -30px; color: #fff; font-weight: 700; padding: 5px 50px; transform: rotate(45deg); font-size: 0.9rem; box-shadow: 0 0 8px rgba(0,0,0,0.3); } .ribbon-preorder { background: linear-gradient(45deg, #ffcc00, #ff9900); color: #222; animation: glowGold 1.5s infinite alternate; } .ribbon-soldout { background: linear-gradient(45deg, #777, #555); color: #fff; opacity: 0.95; } @keyframes glowGold { from { opacity: 0.85; box-shadow: 0 0 5px rgba(255,200,0,0.4); } to { opacity: 1; box-shadow: 0 0 15px rgba(255,200,0,0.8); } } </style> </head> <body> <audio id="templeBell" preload="auto"> <source src="sounds/temple_bell.mp3" type="audio/mpeg"> </audio> <nav class="navbar navbar-expand-lg navbar-dark shadow-sm"> <div class="container"> <a class="navbar-brand" href="#"> <?=$system_name?></a> <div class="ms-auto d-flex align-items-center gap-3"> <span class="online-counter">👥 ออนไลน์: <?=$online_users?> คน</span> <?php if($checkout_locked){ ?> <a href="user/checkout.php" class="btn btn-warning btn-sm"> 🛒 ชำระเงิน <?php if($cart_count > 0): ?><span class="badge-cart"><?=$cart_count?></span><?php endif; ?> </a> <?php }else{ ?> <a href="user/index.php" class="btn btn-warning btn-sm"> 🛒 ตะกร้า <?php if($cart_count > 0): ?><span class="badge-cart"><?=$cart_count?></span><?php endif; ?> </a> <?php } ?> <a href="?" class="btn btn-outline-primary btn-sm">หน้าหลัก</a> <a href="user/check_status.php" class="btn btn-outline-light btn-sm">ตรวจสอบสถานะ</a> <a href="admin/index.php" class="btn btn-outline-warning btn-sm">เข้าสู่ระบบผู้ดูแล</a> </div> </div> </nav> <section class="hero"> <div class="hero-content"> <img src="uploads/logo_cmtc.png" width="100" alt="โลโก้วิทยาลัย" class="mb-3"> <h1><?=$system_name?><?=$coin_name?><br><?=$school_name?></h1> <p>“ร่วมเป็นส่วนหนึ่งแห่งบุญ กับวิทยาลัยเทคนิคเชียงใหม่”</p> <a href="#products" class="btn btn-gold mt-3 px-4 py-2">ดูรายการเหรียญ</a> </div> </section> <div class="container py-5" id="products"> <?php if($booking_status == 'off'): ?> <div class="alert alert-danger text-center fs-5 fw-bold mb-4"> ⛔ ขณะนี้ระบบยังไม่เปิดรับจองเหรียญ </div> <?php endif; ?> <div class="row g-4 justify-content-center"> <?php while($row = $products->fetch_assoc()): ?> <?php // ✅ ดึงจำนวนที่จองแล้ว $count_ordered = 0; $q = $conn->query(" SELECT SUM(i.qty) AS total FROM order_items i JOIN orders o ON o.id = i.order_id WHERE i.product_id = {$row['id']} AND i.confirm_status != 'ยกเลิก' AND i.item_status = 'ปกติ' "); if($q && $r = $q->fetch_assoc()) { $count_ordered = intval($r['total']); } $total = $row['stock'] + $count_ordered; $percent = ($total > 0) ? round(($count_ordered / $total) * 100) : 0; if ($percent <= 30) $barColor = '#28a745'; elseif ($percent <= 70) $barColor = '#ffc107'; else $barColor = '#dc3545'; // ✅ เงื่อนไขแสดง Pre Order / Sold Out $is_preorder = ($row['stock'] <= 0 && $pre_order_status == 'on'); $is_soldout = ($row['stock'] <= 0 && $pre_order_status == 'off'); ?> <div class="col-lg-3 col-md-4 col-sm-6 d-flex align-items-stretch"> <a href="showproduct.php?id=<?=$row['id']?>" class="text-decoration-none text-dark w-100"> <div class="card h-100 border-0 shadow-sm hover-card text-center"> <?php if($is_preorder): ?> <div class="ribbon ribbon-preorder">PRE ORDER</div> <?php elseif($is_soldout): ?> <div class="ribbon ribbon-soldout">SOLD OUT</div> <?php endif; ?> <div class="p-3"> <img src="uploads/products/<?=$row['img1']?>" alt="<?=$row['name']?>" class="img-fluid rounded mx-auto d-block" style="max-height:220px;object-fit:cover;"> </div> <div class="card-body text-center"> <h5 class="fw-bold mb-2"><?=$row['name']?></h5> <div class="d-flex justify-content-center flex-column align-items-center mb-1"> <span class="text-danger fw-semibold">฿<?=number_format($row['price'],2)?></span> </div> <?php if(!$is_preorder && !$is_soldout): ?> <div class="stock-info"> <span class="stock-left">คงเหลือ <?=$row['stock']?> เหรียญ</span> <span class="stock-right">จองแล้ว <?=$count_ordered?> เหรียญ</span> </div> <div class="progress"> <div class="progress-bar" role="progressbar" style="width: <?=$percent?>%; background-color: <?=$barColor?>;" aria-valuenow="<?=$percent?>" aria-valuemin="0" aria-valuemax="100"> </div> </div> <?php elseif($is_preorder): ?> <div class="mt-2 fw-bold text-warning">🛒 เปิดจองล่วงหน้า</div> <?php else: ?> <div class="mt-2 fw-bold text-secondary">❌ เหรียญหมด</div> <?php endif; ?> </div> </div> </a> </div> <?php endwhile; ?> </div> </div> <?php include("footer.php"); ?> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/lightbox2@2.11.4/dist/js/lightbox-plus-jquery.min.js"></script> <script> window.addEventListener('load', () => { const bell = document.getElementById('templeBell'); setTimeout(() => bell.play().catch(()=>{}), 800); }); </script> </body> </html>
| ver. 1.4 |
Github
|
.
| PHP 7.4.33 | Generation time: 0.48 |
proxy
|
phpinfo
|
Settings