# SQL EDU Simulator v1.8

Wersja v0.5 dodaje system kont i ról inspirowany architekturą CyberSafeEDU.

## Role

- **Administrator** – konto wyłącznie serwerowe. Przy pierwszym uruchomieniu tworzy własne konto, następnie tworzy i edytuje konta nauczycieli oraz może resetować ich hasła i blokować konta.
- **Nauczyciel** – konto serwerowe. Może zmieniać własne hasło, tworzyć klasy i generować kody klas oraz zakładać opcjonalne konta serwerowe uczniów.
- **Uczeń** – tryb hybrydowy: może używać profilu lokalnego zapisanego w przeglądarce albo zalogować się na konto serwerowe utworzone przez nauczyciela. Profil lokalny może dołączyć do klasy kodem.

## Uruchomienie

Sam symulator SQL nadal działa jako HTML/JS, ale konta administratora i nauczyciela wymagają serwera z PHP 8+.

Przykład lokalny:

```bash
php -S localhost:8000
```

Następnie otwórz `http://localhost:8000/start.html`.

Na hostingu WWW wystarczy skopiować cały katalog aplikacji i zapewnić PHP oraz prawo zapisu dla katalogu `api/storage/`.

## Bezpieczeństwo

Hasła kont serwerowych nie są zapisywane jawnie. Backend używa `password_hash()` / `password_verify()` oraz sesji PHP. Plik danych kont znajduje się w `api/storage/`, a dołączone reguły `.htaccess` blokują bezpośredni dostęp do niego na serwerach Apache.

## Pierwsze uruchomienie

Jeżeli na serwerze nie ma jeszcze administratora, aplikacja automatycznie wyświetli kreator pierwszego konta administratora. Po jego utworzeniu administrator może założyć konta nauczycieli.

## Aktualny zakres SQL

Misje 1–40: SELECT, WHERE, operatory porównania, LIKE, IN, BETWEEN, NULL, ORDER BY, LIMIT, DISTINCT, COUNT, SUM, AVG, MIN, MAX, GROUP BY, HAVING, INNER JOIN, LEFT JOIN oraz łączenie trzech tabel.

## v0.6 — Centrum Pomocy i tłumaczenia PO
- Centrum Pomocy otwierane przyciskiem `Pomoc` lub klawiszem `F1`.
- Wyszukiwarka tematów i nawigacja kategoriami.
- Pomoc jest rozwijana w `js/help.js`; kolejne moduły powinny dopisywać nowe tematy.
- Angielskie tłumaczenia interfejsu są przechowywane w `lang/en.po`.
- `js/i18n.js` ładuje i parsuje plik PO w przeglądarce.
- Polski pozostaje językiem źródłowym (`msgid`), angielski znajduje się w `msgstr`.


## v0.7 — panel administratora
Panel administratora ma boczne menu w stylu CyberSafeEDU: pulpit, nauczyciele, klasy, użytkownicy, eksport, import, ustawienia, diagnostyka, pomoc oraz wylogowanie. Eksport tworzy pełną kopię JSON, a import waliduje plik przed zastąpieniem danych. Centrum Pomocy i lang/en.po są rozszerzane wraz z funkcjami.


## v0.8 — sekwencyjne misje
Kolejna misja jest dostępna dopiero po prawidłowym zaliczeniu bieżącej. Cofanie do wcześniejszych misji pozostaje dostępne. Reset postępu wraca do Misji 1.


## v0.9 — panel nauczyciela
- stałe lewe menu nauczyciela
- klasy, uczniowie, postępy, import/eksport
- synchronizacja postępu uczniów serwerowych
- zawsze widoczne wylogowanie administratora i nauczyciela


## v1.1 — JOIN
- misje 31–40 uczą INNER JOIN, LEFT JOIN, aliasów tabel i kolumn oraz łączenia trzech tabel
- silnik obsługuje kwalifikowane nazwy kolumn, np. `u.id_ucznia`
- JOIN można łączyć z WHERE, ORDER BY, GROUP BY, HAVING i funkcjami agregującymi
- Centrum Pomocy zawiera nowy temat dotyczący JOIN
- angielskie tłumaczenia nowych misji są dopisywane do `lang/en.po`


## Etap 6 — własne bazy danych
Misje 41–50 uczą CREATE TABLE, INSERT, UPDATE, DELETE, ALTER TABLE i DROP TABLE. Tryb „Moja baza” jest przechowywany lokalnie i oddzielony od bazy szkolnej.


## v1.4 — projekt relacyjnej bazy
- misje 51–60 rozwijają projekt „Biblioteka” w obszarze „Moja baza”
- CREATE TABLE obsługuje PRIMARY KEY, NOT NULL, UNIQUE i REFERENCES
- silnik kontroluje wymagane wartości, unikalność i istnienie rekordów wskazywanych przez klucze obce
- drzewo bazy pokazuje oznaczenia PK, FK, UQ i NN
- uczeń tworzy autorów, czytelników i wypożyczenia, a następnie łączy własne tabele JOIN-em


## Etap 7 — misje 61–70
Podzapytania IN (SELECT...), podzapytania skalarne, EXISTS/NOT EXISTS, CREATE/DROP VIEW oraz CREATE/DROP INDEX. Widoki i indeksy są widoczne w drzewie „Mojej bazy”.


## v1.6 — CASE, UNION, UNION ALL
- Misje 81–90.
- CASE WHEN ... THEN ... ELSE ... END w SELECT.
- Wielokrotne WHEN oraz CASE z WHERE i JOIN.
- UNION usuwa duplikaty.
- UNION ALL zachowuje duplikaty.
- Łączenie wyników z różnych tabel przy zgodnej liczbie kolumn.


## v1.8 — funkcje tekstowe
- Misje 91–100.
- UPPER(), LOWER(), LENGTH(), SUBSTR(), TRIM().
- Konkatenacja tekstów operatorem `||`.
- Pakiet nauczyciela „Funkcje tekstowe” i pełny kurs 1–130.


## v1.8 — Centrum przydzielania misji
- 4 tryby wyboru: gotowy pakiet, ręczny wybór, zakres i losowanie.
- Ręczny wybór zapamiętuje kolejność kliknięć nauczyciela.
- Kolejność: według wyboru, rosnąca wg numerów lub losowa.
- Blokada pomijania misji.
- Limit czasu, liczba prób i próg zaliczenia.
- Selektor obsługuje pełne 130 misji.
- Wczytywanie i klonowanie zestawów między klasami.


## Etap NULL i wartości zastępcze — v1.9
- Misje 101–130.
- COALESCE(), IFNULL(), IS NULL, IS NOT NULL.
- Zagnieżdżanie z UPPER(), LOWER(), LENGTH(), SUBSTR() i łączeniem tekstów.
- Nowy pakiet nauczyciela „NULL i wartości zastępcze”.
- Pełny kurs obejmuje misje 1–180.


## Funkcje matematyczne — v2.0
- Misje 111–130.
- ROUND(), ABS() oraz działania +, -, *, /.
- Obliczenia procentowe i działania po JOIN.
- Panel nauczyciela i backend obsługują pełne 130 misji.
- Nowy pakiet nauczyciela „Funkcje matematyczne”.


## v2.1 — Daty i czas
- Misje 121–130.
- Funkcje DATE(), STRFTIME() i JULIANDAY().
- Filtrowanie i BETWEEN na datach ISO.
- Obliczanie różnicy dat oraz wyciąganie roku, miesiąca, dnia i czasu.
- Pakiet nauczyciela „Daty i czas”; panel i backend obsługują 130 misji.


## v2.2.1 — CTE / WITH
- Misje 131–140.
- Obsługa `WITH nazwa AS (SELECT ...)`.
- Wiele CTE w jednym zapytaniu.
- CTE współpracujące z JOIN, WHERE, GROUP BY i agregacjami.
- Pakiet nauczyciela „CTE (WITH)”; panel i backend obsługują 140 misji.

## v2.2.1 — poprawka Centrum Pomocy
- Dodano widoczny temat „Funkcje matematyczne” z ROUND(), ABS() i działaniami arytmetycznymi.
- Poprawiono osadzenie tematu CTE — WITH w liście tematów Pomocy.


## v2.2.2
- pełne przewijanie obszaru roboczego panelu nauczyciela,
- dostęp do klonowania zestawów niezależnie od wysokości okna,
- własny scroll dużych list uczniów, klas i postępów,
- przyklejone nagłówki tabel dla dużych klas.


## v2.3 — zaawansowane funkcje matematyczne
Dodano misje 141–150: SQRT, POWER, MOD, CEIL, FLOOR, SIGN oraz zadania łączące te funkcje z ROUND, WHERE i JOIN. Panel nauczyciela oraz backend obsługują 150 misji.


## v2.4 — funkcje okienkowe
Dodano misje 151–160: ROW_NUMBER, RANK, DENSE_RANK, OVER, PARTITION BY oraz SUM/AVG/COUNT jako funkcje okienkowe. Panel nauczyciela i backend obsługują 160 misji.


## v2.5.2 — Misje 161–170
Dodano INTERSECT, EXCEPT, COUNT(DISTINCT ...), GROUP_CONCAT() i zadania łączące operatory zbiorów z agregacjami i JOIN. Panel nauczyciela oraz backend obsługują 170 misji.


## O aplikacji / profil autora
Administrator może w Ustawieniach dodać imię i nazwisko autora, bio oraz zdjęcie. Dane te są prezentowane w Centrum Pomocy → O aplikacji. Stopka aplikacji zawiera Copyright 2026 Komputerowka.pl Arnold Basinski.


## v2.6 — Misje 171–180
Dodano praktyczny blok normalizacji i projektowania schematu: 1NF, 2NF, 3NF, rozdzielanie danych na tabele, PRIMARY KEY, FOREIGN KEY oraz końcowy model relacyjny. Panel nauczyciela i backend obsługują 180 misji.

## Panel ucznia (v2.7)
Uczeń serwerowy i uczeń korzystający z profilu lokalnego mają własny panel z pulpitem, postępem, listą zaliczonych misji, aktualnym zestawem i profilem. Profile lokalne przechowują postęp oddzielnie dla każdego ucznia na tym samym komputerze. Konto serwerowe synchronizuje postęp z serwerem i udostępnia nauczycielowi aktualne wyniki.


## v2.7.1
- Panel ucznia: lewe menu ma niezależny pionowy scroll, a dolne akcje pozostają dostępne.


## Konta online v2.8
- Pierwsze uruchomienie przez PHP wymaga utworzenia konta administratora: login, hasło i powtórzenie hasła.
- Administrator i nauczyciel korzystają wyłącznie z kont przechowywanych po stronie serwera.
- Konto ucznia jest hybrydowe: profil lokalny lub konto serwerowe utworzone przez nauczyciela.
- Hasła serwerowe są zapisywane przez PHP z `password_hash()` i weryfikowane przez `password_verify()`.
