Informacje ogólne

Platforma mini gier BitFun

Written By Coder Matthew

Last updated 6 months ago

1) Wprowadzenie

Platforma BitFun Games to dynamiczny serwis internetowy stworzony dla entuzjastów gier casualowych i zręcznościowych. Służy jako centralny katalog gier, umożliwiając użytkownikom rywalizację i śledzenie swoich postępów w rankingach globalnych.

Cały projekt utrzymany jest w nowoczesnej, ciemnej estetyce z dominującymi akcentami neonowo-cyjanowymi, co zapewnia spójne i atrakcyjne doświadczenie wizualne.

Czym jest platforma i jakie ma opcje?

  • Katalog Minigier: BitFun oferuje zestaw wciągających gier WebGL/Unity, takich jak Flappy Bird, Dino Game, Tetris czy Pack-Man, dostępnych do natychmiastowego uruchomienia.

  • Rywalizacja (Leaderboard): Zintegrowany system wyników i rankingów (Leaderboard) pozwala graczom śledzić swoje osiągnięcia i porównywać je z innymi użytkownikami w czasie rzeczywistym.

  • System Kont Użytkowników: Pełna obsługa rejestracji, logowania oraz zarządzania profilem. Konta są chronione silnym haszowaniem haseł (ARGON2ID) i wymagają weryfikacji e-mail.

  • Wsparcie Techniczne: Dedykowany system zgłoszeń (Ticket System) umożliwia zalogowanym użytkownikom szybkie kontaktowanie się z administracją i śledzenie statusu swoich problemów.

2) Przewodnik

2.1) Strona Główna

Na stronie głównej znajduje się katalog dostępnych gier w formie interaktywnych kafelków. Niektóre gry mogą być tymczasowo niedostępne.

2.2) Logowanie i Rejestracja

Platforma wymaga konta do pełnego korzystania z funkcji rankingowych i wsparcia. Rejestracja jest zabezpieczona przez Google reCAPTCHA.

2.3) Panel Użytkownika i Osiągnięcia

W panelu użytkownika można znaleźć szczegóły konta oraz sekcję Osiągnięcia, która wyświetla najlepsze wyniki gracza w poszczególnych grach. Użytkownik ma również opcję zmiany hasła.

2.4) Gra i Ranking

Po wybraniu gry, jest ona ładowana w widoku gry za pomocą technologii Unity/WebGL. Pod oknem gry znajduje się opcja Fullscreen oraz przyciski Resetuj i Pomoc. Pod grą, jeśli gra obsługuje ranking, wyświetlana jest automatycznie aktualizowana tabela Najlepszych Wyników (Top 10).

2.5) Wsparcie techniczne

Użytkownik może wypełnić formularz kontaktowy (Temat i Wiadomość). Po wysłaniu, zgłoszenie przechodzi do historii zgłoszeń wraz z statusem oczekującego.

2.6) Zmiana hasła

Dostępna jest możliwość zmiany hasła bez kontaktu z wsparciem, w tym celu należy przejść do ustawień a następnie usupełnić stare hasło, nowe oraz ponownie nowe.

2.7) Aktywacja konta

Rejestracja nowego konta wymaga jego aktywacji, w tym celu nalerzy przejść do klienta poczty email odszukać mail od Zespołu BitFun a następnie kliknąć Aktywuj Konto

3) Kod źródłowy

Download Full Source Code

3.1) Katalog index

PHP:

Example
<?php session_start(); ?> <!DOCTYPE html> <html lang="pl"> <head> <?php include("modules/seo.php"); ?> <link href="scripts/index.css" rel="stylesheet"> </head> <body> <?php include("modules/header.php"); ?> <section class="section"> <div class="container"> <h1 class="title is-1 has-text-centered has-text-light mb-6"> Wybierz Grę </h1> <div class="columns is-multiline is-centered"> <?php require_once("scripts/db.php"); $stmt = $db->prepare("SELECT * FROM `games` ORDER BY av DESC"); $stmt->execute(); $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { if($row['av']) { echo "<div class='column is-4-tablet is-3-desktop'> <div class='box game-tile p-0'> <figure class='image is-16by9'> <img class='post-img' src='{$row['img']}' alt='{$row['title']}'> </figure> <div class='p-4'> <h3 class='title is-4 has-text-light'>{$row['title']}</h3> <p class='subtitle is-6 has-text-grey-light mb-4'> {$row['descr']} </p> <a href='game.php?id={$row['id']}' class='button is-primary is-fullwidth'> <span class='icon'><i class='fas fa-play'></i></span> <span>Zagraj</span> </a> </div> </div> </div>";} else { echo "<div class='column is-4-tablet is-3-desktop'> <div class='box game-tile p-0' style='opacity: 0.5;'> <figure class='image is-16by9'> <img class='post-img' src='{$row['img']}' alt='{$row['title']}'> </figure> <div class='p-4'> <h3 class='title is-4 has-text-light'>{$row['title']}</h3> <p class='subtitle is-6 has-text-grey-light mb-4'> {$row['descr']} </p> <button class='button is-fullwidth' disabled> <span class='icon'><i class='fas fa-lock'></i></span> <span>Niedostępne</span> </button> </div> </div> </div>";} } $stmt->close(); $db->close(); ?> </div> </div> </section> <center> <script type="text/javascript"> atOptions = { 'key' : '368d0d81ec9dedaeff7e513a91a117c2', 'format' : 'iframe', 'height' : 90, 'width' : 728, 'params' : {} }; </script> <script type="text/javascript" src="//www.highperformanceformat.com/368d0d81ec9dedaeff7e513a91a117c2/invoke.js"></script> </center> </br> <?php include("modules/footer.php"); ?> </body> </html>

3.2) Katalog scripts

CSS:

Example
:root { --neon-cyan: #00f5d4; --dark-bg: #1a1a2e; --tile-bg: #1f2833; --text-color: #e0e0e0; --border-color: #45a29e; } html, body { background-color: var(--dark-bg); font-family: 'Rajdhani', sans-serif; color: var(--text-color); } .title, .subtitle, .button, .navbar-item, .label { font-family: 'Rajdhani', sans-serif; } .button.is-primary { background-color: var(--neon-cyan); color: var(--dark-bg); font-weight: 700; border: none; } .button.is-primary:hover { background-color: #ffffff; color: var(--dark-bg); box-shadow: 0 0 15px var(--neon-cyan); } .box.form-box { background-color: var(--tile-bg); border: 1px solid var(--border-color); } .form-box .label { color: var(--text-color); } .form-box .input { background-color: var(--dark-bg); border-color: var(--border-color); color: var(--text-color); } .form-box .input::placeholder { color: #777; } .neon-title { color: var(--neon-cyan); border-bottom: 2px solid var(--neon-cyan); padding-bottom: 10px; margin-bottom: 30px; }

PHP:

Example
<?php $db = new mysqli("localhost","matthew","","matthew_bitfun"); ?>

JS:

Example
document.addEventListener('DOMContentLoaded', () => { const loginForm = document.getElementById('login-form'); const registerForm = document.getElementById('register-form'); const displayMessage = (form, message, type) => { const messageBox = form.querySelector('#message-box'); if (!messageBox) return; const messageClass = type === 'success' ? 'notification is-success' : 'notification is-danger'; messageBox.innerHTML = `<div class="${messageClass} is-light">${message}</div>`; }; const clearMessage = (form) => { const messageBox = form.querySelector('#message-box'); if (messageBox) { messageBox.innerHTML = ''; } }; if (registerForm) { registerForm.addEventListener('submit', async (e) => { e.preventDefault(); clearMessage(registerForm); const registerButton = document.getElementById('register-btn'); registerButton.classList.add('is-loading'); const formData = new FormData(registerForm); try { const response = await fetch('execs/exec_register.php', { method: 'POST', body: formData }); const data = await response.json(); if (data.success) { displayMessage(registerForm, data.message, 'success'); registerForm.reset(); grecaptcha.reset(); } else { displayMessage(registerForm, data.message, 'error'); grecaptcha.reset(); } } catch (error) { displayMessage(registerForm, 'Wystąpił błąd sieci. Spróbuj ponownie.', 'error'); grecaptcha.reset(); } registerButton.classList.remove('is-loading'); }); } const supportForm = document.getElementById('support-form'); if (supportForm) { supportForm.addEventListener('submit', async (e) => { e.preventDefault(); clearMessage(supportForm); const supportButton = document.getElementById('support-btn'); supportButton.classList.add('is-loading'); const formData = new FormData(supportForm); try { const response = await fetch('execs/exec_support.php', { method: 'POST', body: formData }); const data = await response.json(); if (data.success) { displayMessage(supportForm, data.message, 'success'); supportForm.reset(); setTimeout(() => { window.location.reload(); }, 2000); } else { displayMessage(supportForm, data.message, 'error'); } } catch (error) { displayMessage(supportForm, 'Wystąpił błąd sieci. Spróbuj ponownie.', 'error'); } supportButton.classList.remove('is-loading'); }); } if (loginForm) { loginForm.addEventListener('submit', async (e) => { e.preventDefault(); clearMessage(loginForm); const loginButton = document.getElementById('login-btn'); loginButton.classList.add('is-loading'); const formData = new FormData(loginForm); try { const response = await fetch('execs/exec_login.php', { method: 'POST', body: formData }); const data = await response.json(); if (data.success) { displayMessage(loginForm, data.message, 'success'); window.location.href = 'index.php'; } else { displayMessage(loginForm, data.message, 'error'); } } catch (error) { displayMessage(loginForm, 'Wystąpił błąd sieci. Spróbuj ponownie.', 'error'); } loginButton.classList.remove('is-loading'); }); } });

3.3) Katalog modules

PHP:

Example
<footer class="footer" style="background-color: #090A0C; border-top: 1px solid var(--border-color); padding: 2rem 0; "> <div class="container has-text-centered"> <p style="color: var(--text-color); margin-bottom: 0.5rem;"> &copy; 2025 BitFun Games by Mateusz Król & Michał Biały.<br> Wszelkie prawa zastrzeżone. </p> <p style="color: var(--neon-cyan); font-size: 0.9rem;"> Stworzono z pasją dla graczy </p> <div class="social-icons mt-2"> <a href="https://www.facebook.com/?locale=pl_PL" class="icon" style="color: var(--neon-cyan); margin: 0 0.5rem;"><i class="fab fa-facebook-f"></i></a> <a href="https://x.com/?lang=pl" class="icon" style="color: var(--neon-cyan); margin: 0 0.5rem;"><i class="fab fa-twitter"></i></a> <a href="https://www.instagram.com/" class="icon" style="color: var(--neon-cyan); margin: 0 0.5rem;"><i class="fab fa-instagram"></i></a> </div> </div> </footer>

3.4) Katalog execs

PHP:

Example
<?php require_once("../scripts/db.php"); if ($db->connect_error) { die("Błąd połączenia z bazą danych: " . $db->connect_error); } $db->set_charset("utf8mb4"); session_start(); header('Content-Type: application/json'); $response = ['success' => false, 'message' => '']; if ($_SERVER['REQUEST_METHOD'] !== 'POST') { $response['message'] = 'Nieprawidłowa metoda żądania.'; $db->close(); echo json_encode($response); exit; } $mail = trim($_POST['mail'] ?? ''); $password = $_POST['password'] ?? ''; if (empty($mail) || empty($password)) { $response['message'] = 'Wszystkie pola są wymagane.'; $db->close(); echo json_encode($response); exit; } $stmt = $db->prepare("SELECT id, nick, pass, verified FROM users WHERE mail = ?"); $stmt->bind_param("s", $mail); $stmt->execute(); $result = $stmt->get_result(); if ($result->num_rows === 0) { $response['message'] = 'Nieprawidłowy e-mail lub hasło.'; $stmt->close(); $db->close(); echo json_encode($response); exit; } $user = $result->fetch_assoc(); $stmt->close(); if (!password_verify($password, $user['pass'])) { $response['message'] = 'Nieprawidłowy e-mail lub hasło.'; $db->close(); echo json_encode($response); exit; } if ($user['verified'] == 0) { $response['message'] = 'Konto nie zostało aktywowane. Sprawdź swój e-mail.'; $db->close(); echo json_encode($response); exit; } session_regenerate_id(true); $_SESSION['user_id'] = $user['id']; $_SESSION['nick'] = $user['nick']; $response['success'] = true; $response['message'] = 'Logowanie pomyślne! Przekierowywanie...'; $db->close(); echo json_encode($response);

3.5) Katalog execs/api

PHP:

Example
<?php require_once("../../scripts/db.php"); header("Content-Type: application/json"); if (!isset($_GET['game_id'])) { echo json_encode(["status" => "error", "message" => "Brak game_id"]); exit; } $game_id = intval($_GET['game_id']); $sql = "SELECT r.score, r.date, u.nick FROM records r JOIN users u ON r.user_id = u.id WHERE r.game_id = ? ORDER BY r.score DESC LIMIT 10"; $stmt = $db->prepare($sql); $stmt->bind_param("i", $game_id); $stmt->execute(); $res = $stmt->get_result(); $data = []; $pos = 0; while ($row = $res->fetch_assoc()) { $pos++; $date = new DateTime($row['date']); $newDate = $date->format('Y-m-d'); $data[] = [ "pos" => $pos, "nick" => $row["nick"], "score" => $row["score"], "date" => $newDate ]; } echo json_encode(["status" => "ok", "rows" => $data]);

3.6) Katalog errors

PHP

Example
<!DOCTYPE html> <html lang="pl"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>403 - Dostęp zabroniony</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.3/css/bulma.min.css"> <link href="https://fonts.googleapis.com/css2?family=Rajdhani:wght@300;400;500;600;700&display=swap" rel="stylesheet"> <style> /* Style są identyczne jak w 404, aby zachować spójność */ :root { --neon-cyan: #00f5d4; --dark-bg: #1a1a2e; --tile-bg: #1f2833; --text-color: #e0e0e0; --border-color: #45a29e; } html, body { background-color: var(--dark-bg); font-family: 'Rajdhani', sans-serif; color: var(--text-color); height: 100%; } .error-container { min-height: 100vh; display: flex; justify-content: center; align-items: center; } .box.error-box { background-color: var(--tile-bg); border: 1px solid var(--border-color); padding: 40px; text-align: center; } .error-code { font-size: 10rem; font-weight: 700; color: var(--neon-cyan); line-height: 1; text-shadow: 0 0 20px rgba(0, 245, 212, 0.5); margin-bottom: 0; } .error-message { color: var(--text-color); font-size: 1.5rem; margin-top: 10px; margin-bottom: 30px; } .button.is-primary { background-color: var(--neon-cyan); color: var(--dark-bg); font-weight: 700; border: none; } .button.is-primary:hover { background-color: #ffffff; color: var(--dark-bg); box-shadow: 0 0 15px var(--neon-cyan); } </style> </head> <body> <div class="error-container"> <div class="column is-two-thirds-tablet is-half-desktop is-one-third-widescreen"> <div class="box error-box"> <p class="error-code">403</p> <h1 class="error-message">Dostęp Zabroniony</h1> <p>Nie masz uprawnień, aby uzyskać dostęp do tego zasobu lub katalogu.</p> <div class="mt-5"> <a href="../index.php" class="button is-primary is-medium">Wróć do strony głównej</a> </div> </div> </div> </div> </body> </html>

3.7) Baza danych

SQL:

Example
-- phpMyAdmin SQL Dump -- version 5.1.1deb5ubuntu1 -- https://www.phpmyadmin.net/ -- -- Host: localhost:3306 -- Czas generowania: 30 Lis 2025, 17:47 -- Wersja serwera: 8.0.44-0ubuntu0.22.04.1 -- Wersja PHP: 8.1.2-1ubuntu2.22 SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; START TRANSACTION; SET time_zone = "+00:00"; /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8mb4 */; -- -- Baza danych: `matthew_bitfun` -- -- -------------------------------------------------------- -- -- Struktura tabeli dla tabeli `games` -- CREATE TABLE `games` ( `id` int NOT NULL, `path` text COLLATE utf8mb4_polish_ci NOT NULL, `img` text COLLATE utf8mb4_polish_ci NOT NULL, `title` varchar(200) COLLATE utf8mb4_polish_ci NOT NULL, `descr` text COLLATE utf8mb4_polish_ci NOT NULL, `av` tinyint(1) NOT NULL, `score` tinyint(1) NOT NULL, `date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `author_id` int NOT NULL, `rate` int NOT NULL DEFAULT '5' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_polish_ci; -- -- Zrzut danych tabeli `games` -- INSERT INTO `games` (`id`, `path`, `img`, `title`, `descr`, `av`, `score`, `date`, `author_id`, `rate`) VALUES (3, '--', 'imgs/1.png', 'Snake', 'Zjedz wszystko, nie ugryź siebie! Uważaj na ściany!', 1, 1, '2025-11-14 12:18:47', 1, 5), (4, 'games/SlotMachine/Build/SlotMachine', 'imgs/2.png', 'Slot machine', 'Prosta gra, wielka wygrana! Nie czekaj na szczęście!', 1, 0, '2025-11-14 12:18:47', 16, 5), (5, '--', 'imgs/TimberMan.png', 'Timber Man', 'Rąb bez końca, nie zmiażdż się gałęzią! Uważaj na czas!', 0, 0, '2025-11-14 12:20:00', 1, 5), (6, '--', 'imgs/Gta6.png', 'Grand Theft Auto VI', 'Uzbieraj fortunę, nie daj się złapać policji! Uważaj na sześć gwiazdek!', 0, 0, '2025-11-29 18:32:35', 18, 5), (14, 'games/FlappyBird/Build/FlappyBird', 'imgs/FlappyBird.png', 'Flappy Bird', 'Utrzymaj się w powietrzu, nie dotknij rur! Uważaj na grawitację!', 1, 1, '2025-11-28 23:58:27', 18, 5), (15, 'games/DinoGame/Build/DinoGame', 'imgs/DinoGame.png', 'Dino Game', 'Przeskakuj kaktusy, nie wpadnij na pterodaktyla! Uważaj na prędkość!', 1, 1, '2025-11-29 01:40:24', 18, 5), (16, 'games/GeometryDash/Build/GeometryDash', 'imgs/GeometryDash.png', 'Geometry Dash', 'Skończ poziom, nie rozbij kostki! Uważaj na rytm!', 1, 1, '2025-11-29 01:43:22', 16, 5), (17, 'games/RacingGame/Build/RacingGame', 'imgs/RacingGame.png', 'Racing Game', 'Ukończ wyścig, nie wpadnij na rywali! Uważaj na zakręty!', 1, 0, '2025-11-29 02:50:13', 16, 5), (18, 'games/FruitNinja/Build/FruitNinja', 'imgs/FruitNinja.png', 'Fruit Ninja', 'Pokrój owoc, nie dotknij bomby! Uważaj na palce!', 1, 1, '2025-11-29 03:11:19', 18, 5), (19, 'games/PackMan/Build/PackMan', 'imgs/PackMan.png', 'Pack-Man', 'Zjedz wszystkie kropki, nie daj się złapać duchom! Uważaj na drodze!', 1, 1, '2025-11-29 18:25:04', 18, 5), (20, 'games/Tetris/Build/Tetris', 'imgs/Tetris.png', 'Tetris', 'Wypełnij linię, nie zostaw dziury! Uważaj na wysokość!', 1, 1, '2025-11-29 20:46:21', 18, 5); -- -------------------------------------------------------- -- -- Struktura tabeli dla tabeli `records` -- CREATE TABLE `records` ( `game_id` int NOT NULL, `user_id` int NOT NULL, `score` int NOT NULL, `date` timestamp NULL DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_polish_ci; -- -- Zrzut danych tabeli `records` -- INSERT INTO `records` (`game_id`, `user_id`, `score`, `date`) VALUES (3, 16, 500, '2025-11-20 11:07:05'), (14, 16, 19, '2025-11-29 00:52:56'), (14, 18, 103, '2025-11-29 01:47:04'), (15, 16, 116, '2025-11-29 02:45:03'), (15, 18, 877, '2025-11-29 02:16:18'), (18, 16, 48, '2025-11-29 23:59:41'), (18, 18, 23, '2025-11-29 03:16:03'), (19, 18, 12810, '2025-11-29 18:29:07'), (19, 19, 4270, '2025-11-29 23:32:04'), (20, 18, 200, '2025-11-29 21:08:15'); -- -------------------------------------------------------- -- -- Struktura tabeli dla tabeli `support` -- CREATE TABLE `support` ( `id` int NOT NULL, `user_id` int NOT NULL, `subject` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `message` text COLLATE utf8mb4_unicode_ci NOT NULL, `ip_address` varchar(45) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `status` enum('open','answered','closed') COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'open', `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- -- Zrzut danych tabeli `support` -- INSERT INTO `support` (`id`, `user_id`, `subject`, `message`, `ip_address`, `status`, `created_at`, `updated_at`) VALUES (1, 16, 'hello', 'world<h1>Test</h1>', '192.168.1.166', 'open', '2025-11-17 17:04:46', '2025-11-17 17:04:46'), (2, 16, 'fddfggfd', 'fdggdffdggfdfgd', '192.168.1.166', 'answered', '2025-11-17 17:05:01', '2025-11-17 17:05:38'), (3, 16, 'hjhjkhjkk', 'hjkjkhhjkhjkhjk', '192.168.1.166', 'closed', '2025-11-17 17:05:08', '2025-11-17 17:05:51'), (4, 16, 'sdfdfsfsd', 'dsfdsfsfsdfsd', '192.168.1.166', 'open', '2025-11-17 17:10:48', '2025-11-17 17:10:48'), (5, 16, 'fdgfddfgfdg', 'dfgfdgfgdfgdfdgdfg', '192.168.1.166', 'open', '2025-11-17 17:11:42', '2025-11-17 17:11:42'); -- -------------------------------------------------------- -- -- Struktura tabeli dla tabeli `users` -- CREATE TABLE `users` ( `id` int NOT NULL, `nick` varchar(40) COLLATE utf8mb4_polish_ci NOT NULL, `mail` varchar(120) COLLATE utf8mb4_polish_ci NOT NULL, `pass` varchar(300) COLLATE utf8mb4_polish_ci NOT NULL, `verified` tinyint(1) NOT NULL DEFAULT '0', `verified_code` varchar(200) COLLATE utf8mb4_polish_ci NOT NULL, `date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `ip` varchar(20) COLLATE utf8mb4_polish_ci NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_polish_ci; -- -- Zrzut danych tabeli `users` -- INSERT INTO `users` (`id`, `nick`, `mail`, `pass`, `verified`, `verified_code`, `date`, `ip`) VALUES (16, 'Hekki', 'djprzerubka@gmail.com', '$argon2id$v=19$m=65536,t=4,p=1$RlhmZjJ0WU1DMGxQYUtGcg$Fs0POyPnLcRgZj4vuPhood9RApStzrixKKnUI0CaA+A', 1, '403a148a713bab3c9bed8666ba683b74e1431e4541', '2025-11-17 17:03:14', '192.168.1.166'), (18, 'Michal White', 'xmilaxer@gmail.com', '$argon2id$v=19$m=65536,t=4,p=1$aFBrZ25CTjBrSnVUYkM1bw$dPNZGFSeFIgD17rnU0RPVJhFXjEHUOfGq+xrp1mLols', 1, '800a09e586a7576fca0f8d7bf090e129cdbf20868c', '2025-11-28 23:57:08', '192.168.1.166'); -- -- Indeksy dla zrzutów tabel -- -- -- Indeksy dla tabeli `games` -- ALTER TABLE `games` ADD PRIMARY KEY (`id`), ADD UNIQUE KEY `title` (`title`); -- -- Indeksy dla tabeli `records` -- ALTER TABLE `records` ADD UNIQUE KEY `game_id` (`game_id`,`user_id`); -- -- Indeksy dla tabeli `support` -- ALTER TABLE `support` ADD PRIMARY KEY (`id`), ADD KEY `fk_support_user_idx` (`user_id`); -- -- Indeksy dla tabeli `users` -- ALTER TABLE `users` ADD PRIMARY KEY (`id`), ADD UNIQUE KEY `nick` (`nick`), ADD UNIQUE KEY `verified_code` (`verified_code`); -- -- AUTO_INCREMENT dla zrzuconych tabel -- -- -- AUTO_INCREMENT dla tabeli `games` -- ALTER TABLE `games` MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=21; -- -- AUTO_INCREMENT dla tabeli `support` -- ALTER TABLE `support` MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6; -- -- AUTO_INCREMENT dla tabeli `users` -- ALTER TABLE `users` MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=21; -- -- Ograniczenia dla zrzutów tabel -- -- -- Ograniczenia dla tabeli `support` -- ALTER TABLE `support` ADD CONSTRAINT `fk_support_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE; COMMIT; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

4) Autorzy

Platforma BitFun Games została stworzona przez:

  • Mateusz Król

  • Michał Biały

Projekt zrealizowany na zlecenie: Zespół Szkół Technicznych i Ogólnokształcących im. Stefana Banacha w Jarosławiu

Całkowita liczba kodu platformy: 4477
Całkowita liczba kodu gier: 3271
Całkowita liczba stron dokumentacji: 160