INF.03-05-24.01-SGStyczeń 2024 · 40 kroków · ok. 72 min · 35 kryteriów z klucza
Rozwiązanie krok po kroku: Salon kosmetyczny z bazą (Wersja podstawowa)
Rozwiązanie buduje witrynę salonu kosmetycznego: baza salon i cztery zapytania - filtr cen, średnia i liczba w grupie (AVG, COUNT), nowy użytkownik bazy (CREATE USER) i nadanie mu uprawnień (GRANT), potem dwa obrazy przeskalowane do zadanej szerokości, dwie strony (index.html i twarz.html) z czterema blokami w dwóch kolumnach, style w styl7.css i skrypt JavaScript na stronie zabiegów na twarz: kalkulator, który sumuje ceny zaznaczonych zabiegów.
To jest wersja podstawowa. W zakładce „Nowoczesny kod (grid, osobny skrypt)” jest drugi sposób rozwiązania tego samego arkusza: cztery bloki na siatce CSS z nazwanymi obszarami, kolory w zmiennych, pola wyboru w etykietach i skrypt w osobnym pliku z cennikiem w obiekcie - obie wersje są zgodne z kluczem.
Kroki idą zdanie po zdaniu za treścią arkusza - przy każdym jest polecenie z arkusza, a kod pokazuje dokładnie te linie, które je spełniają. Strona główna powstaje w całości, a twarz.html powstaje z jej kopii - różni się tylko drugim blokiem prawym. Skrypt jest najpierw pisany najprościej (onclick, osobny if dla każdego pola), a na końcu zostaje przerobiony na wersję z prawdziwych projektów.
Baza i grafiki pochodzą z prawdziwego archiwum materialy5 (załącznik do arkusza, hasło w treści zadania). Zapytania i zrzuty są policzone na MariaDB 10.4 - tej samej, która jest w XAMPP. Skrypt jest sprawdzony dla wszystkich 16 kombinacji zaznaczonych pól; w podglądzie strony twarz.html można zaznaczać zabiegi i klikać „Oblicz cenę”.
Jak liczą się punkty. Klucz ma 35 kryteriów (R.1.1 - R.5.6), każde za 1 punkt. Próg zdania części praktycznej to 75%, czyli 27 punktów - można stracić 8 kryteriów i nadal zdać. Przy każdym kroku jest napisane, które kryteria spełnia; egzaminator ocenia spełnienie kryteriów z klucza, nie zgodność z tym kodem.
Suwak i strzałki obok niego - albo ←→ na klawiaturze - przechodzą krok po kroku; wyjaśnienie, pliki i podgląd zmieniają się razem z krokiem.
Lista „Etap” przenosi od razu do wybranego etapu.
„Rozwiązuję samodzielnie” chowa rozwiązanie kroku - najpierw własna próba, potem odsłonięcie.
„Tryb prezentacji” pokazuje same kroki, bez menu strony - na rzutnik.
Etap 1: Baza danych
Kroki 1-7 · po tym etapie masz 6 z 35 kryteriów (pkt)
Krok 1: Baza danych salon
Kryteria:
R.1.1 Wykonano import tabel do bazy danych salon czynność udokumentowano plikiem o nazwie import w formacie PNG
ok. 2 min
Polecenie z arkusza
Utwórz bazę danych o nazwie salon.
Rozpakuj materialy5.7z z pulpitu (hasło Do!!@rozp@#) do folderu z numerem zdającego: egzamin.sql, obraz1.jpg i obraz2.jpg. W phpMyAdmin: Nowa, nazwa salon, porównywanie np. utf8_unicode_ci.
Krok 2: Import tabel z pliku egzamin.sql
Kryteria:
R.1.1 Wykonano import tabel do bazy danych salon czynność udokumentowano plikiem o nazwie import w formacie PNG
ok. 2 min
Polecenie z arkusza
Do bazy salon zaimportuj tabele z pliku egzamin.sql z rozpakowanego archiwum.
Import → egzamin.sql. Plik zawiera kilka tabel; w zadaniu potrzebne są dwie z obrazu 1: uslugi (10 usług z ceną i rodzajem: 1 - kosmetyczne, 2 - fryzjerskie, 3 - inne) i kadra (pracownicy).
Krok 3: Zrzut ekranu import.png
Kryteria:
R.1.1 Wykonano import tabel do bazy danych salon czynność udokumentowano plikiem o nazwie import w formacie PNG
ok. 2 min
Polecenie z arkusza
Wykonaj zrzut ekranu po imporcie. Zrzut zapisz w formacie PNG pod nazwą import. Nie kadruj zrzutu. Zrzut powinien obejmować cały ekran monitora, z widocznym paskiem zadań. Na zrzucie powinny być widoczne elementy wskazujące na poprawnie wykonany import tabel.
Print Screen i zapis jako import.png. Zrzuty zapytań mają być w JPEG (kw1.jpg - kw4.jpg) i zawierać treść zapytania.
Typowe błędy
Wykadrowany zrzut albo zrzut bez paska zadań nie jest oceniany.
Krok 4: Zapytanie 1: usługi od 50 zł
Kryteria: ,
R.1.2 Zapisano plik kwerendy.txt zawierający co najmniej jedno zapytanie SQL, wynikające z treści zadania
R.1.3 Wykonano zapytanie 1 wybierające jedynie pola nazwa i cena z tabeli uslugi dla usług, których cena jest wyższa lub równa 50 zł. W pliku z kwerendami lub na zrzucie istnieje zapis np.: SELECT nazwa, cena FROM uslugi WHERE cena >= 50; oraz wynik działania udokumentowano zrzutem, na którym widoczne są jedynie dane: Farbowanie 50; Ustalenie diety 70; Paznokcie 90
ok. 2 min
Polecenie z arkusza
Zapytanie 1: wybierające jedynie pola nazwa i cena z tabeli uslugi dla usług, których cena jest wyższa lub równa 50 zł.
SELECT nazwa, cena FROM uslugi - dwie kolumny z tabeli usług,
WHERE cena >= 50 - „wyższa lub równa” to >=; usługa za dokładnie 50 zł też się liczy.
Wynik: trzy usługi - Farbowanie 50, Ustalenie diety 70, Paznokcie 90, jak w kluczu. Zapytanie do kwerendy.txt, zrzut kw1.jpg.
Typowe błędy
cena > 50 gubi Farbowanie za równe 50 zł.
kwerendy.txtTekstnowy plik
-- Zapytanie 1SELECT nazwa, cena FROM uslugi WHERE cena >= 50;
Podgląd strony po tym kroku
Krok 5: Zapytanie 2: średnia cena i liczba usług kosmetycznych
Kryteria:
R.1.4 Wykonano zapytanie 2 liczące jedynie dla usług kosmetycznych średnią arytmetyczną cen usług oraz liczbę usług. W pliku z kwerendami lub na zrzucie istnieje zapis np.: SELECT AVG(cena), COUNT(*) FROM uslugi WHERE rodzaj = 1; oraz wynik działania udokumentowano zrzutem, na którym widoczne są liczby 36 i 5
ok. 2 min
Polecenie z arkusza
Zapytanie 2: liczące średnią arytmetyczną cen usług oraz liczbę usług jedynie dla usług kosmetycznych.
AVG(cena) - średnia arytmetyczna, COUNT(*) - liczba wierszy; obie funkcje zwracają jeden wiersz wyniku,
WHERE rodzaj = 1 - usługi kosmetyczne mają w polu rodzaj wartość 1 (opis tabeli w arkuszu).
Wynik: 36 i 5 - pięć usług kosmetycznych o średniej cenie 36 zł, jak w kluczu. Zrzut kw2.jpg.
Typowe błędy
WHERE rodzaj = 'kosmetyczne' nic nie znajdzie - rodzaj jest liczbą, a nie nazwą.
kwerendy.txtTekstzmienione: 3 linie
-- Zapytanie 1SELECT nazwa, cena FROM uslugi WHERE cena >= 50;-- Zapytanie 2SELECT AVG(cena), COUNT(*) FROM uslugi WHERE rodzaj = 1;
Podgląd strony po tym kroku
Krok 6: Zapytanie 3: użytkownik kosmetyczka
Kryteria:
R.1.5 Wykonano zapytanie 3 tworzące użytkownika kosmetyczka na localhost z hasłem Kosmet34 W pliku z kwerendami lub na zrzucie istnieje zapis np.: CREATE USER 'kosmetyczka'@'localhost' IDENTIFIED BY 'Kosmet34'; oraz wynik działania udokumentowano zrzutem, na którym widoczny jest komunikat o pomyślnym wykonaniu zapytania oraz zapytanie z jawnie podanym hasłem
ok. 2 min
Polecenie z arkusza
Zapytanie 3: tworzące użytkownika kosmetyczka na localhost z hasłem Kosmet34.
CREATE USER 'kosmetyczka'@'localhost' - konto w MariaDB to para nazwa@host; localhost znaczy, że użytkownik może się logować tylko z tego samego komputera,
IDENTIFIED BY 'Kosmet34' - hasło jawnym tekstem, baza sama zapisze jego skrót.
phpMyAdmin pokazuje komunikat o wykonaniu zapytania. Zrzut kw3.jpg - klucz wymaga, żeby było na nim widać zapytanie z hasłem.
Typowe błędy
Utworzenie konta przez kreator Konta użytkowników zamiast zapytania nie zostawia zapytania na zrzucie ani w kwerendach.
kwerendy.txtTekstzmienione: 3 linie
-- Zapytanie 1SELECT nazwa, cena FROM uslugi WHERE cena >= 50;-- Zapytanie 2SELECT AVG(cena), COUNT(*) FROM uslugi WHERE rodzaj = 1;-- Zapytanie 3CREATE USER 'kosmetyczka'@'localhost' IDENTIFIED BY 'Kosmet34';
Podgląd strony po tym kroku
Krok 7: Zapytanie 4: prawa do tabeli uslugi
Kryteria:
R.1.6 Wykonano zapytanie 4 nadające prawa przeglądania danych i aktualizacji do tabeli uslugi bazy salon dla użytkownika kosmetyczka. W pliku z kwerendami lub na zrzucie istnieje zapis np.: GRANT SELECT, UPDATE ON uslugi TO 'kosmetyczka'@'localhost'; oraz wynik działania udokumentowano zrzutem, na którym widoczny jest komunikat o poprawnym wykonaniu zapytania
ok. 2 min
Polecenie z arkusza
Zapytanie 4: nadające prawa przeglądania danych i aktualizacji do tabeli uslugi bazy salon dla użytkownika kosmetyczka.
GRANT SELECT, UPDATE - „przeglądanie danych” to SELECT, „aktualizacja” to UPDATE,
ON salon.uslugi - tylko jedna tabela jednej bazy (baza.tabela); salon.* dałoby prawa do wszystkich tabel bazy,
TO 'kosmetyczka'@'localhost' - dokładnie to konto, które utworzyło zapytanie 3.
Sprawdzone: SHOW GRANTS dla tego konta zwraca GRANT SELECT, UPDATE ON salon.uslugi. Zrzut kw4.jpg.
Typowe błędy
TO kosmetyczka bez hosta odwołuje się w MariaDB do konta kosmetyczka@'%' - innego niż utworzone, więc zapytanie kończy się błędem.
kwerendy.txtTekstzmienione: 3 linie
-- Zapytanie 1SELECT nazwa, cena FROM uslugi WHERE cena >= 50;-- Zapytanie 2SELECT AVG(cena), COUNT(*) FROM uslugi WHERE rodzaj = 1;-- Zapytanie 3CREATE USER 'kosmetyczka'@'localhost' IDENTIFIED BY 'Kosmet34';-- Zapytanie 4GRANT SELECT, UPDATE ON salon.uslugi TO 'kosmetyczka'@'localhost';
Podgląd strony po tym kroku
Etap 2: Grafika i strony HTML
Kroki 8-26 · po tym etapie masz 18 z 35 kryteriów (pkt)
Krok 8: Obrazy: szerokość 240 i 700 px
Kryteria:
R.2.1 Przynajmniej jedną grafikę przeskalowano z zachowaniem proporcji. Wymiary dla obraz1.jpg szerokość 240 px i odpowiadająca temu wysokość 300 px (± 5 px) lub obraz2.jpg szerokość 700 px i odpowiadająca temu wysokość 296 px (± 5 px)
ok. 3 min
Polecenie z arkusza
Plik obraz1.jpg, wypakowany z archiwum, należy przeskalować z zachowaniem proporcji tak, aby jego szerokość wynosiła dokładnie 240 px. Plik obraz2.jpg, wypakowany z archiwum, należy przeskalować z zachowaniem proporcji tak, aby jego szerokość wynosiła dokładnie 700 px.
W GIMP-ie dla każdego pliku Obraz → Skaluj obraz z zamkniętym łańcuchem: obraz1.jpg - szerokość 240, wysokość wychodzi 300 px; obraz2.jpg - szerokość 700, wysokość 296 px - jak w kluczu. Plik → Nadpisz zostawia format JPG.
Podgląd strony po tym kroku
Krok 9: Plik index.html w HTML5
Kryteria:
R.2.2 Witrynę internetową zapisano w plikach index.html i twarz.html oraz na stronie zastosowano deklarację języka HTML5 <!DOCTYPE html>, zadeklarowano język witryny polski np. <html lang = "pl"> oraz zapisano jawnie właściwy standard kodowania polskich znaków
ok. 1 min
Polecenie z arkusza
Cechy witryny: Składa się ze stron o nazwach index.html oraz twarz.html. Obie strony różnią się jedynie drugim blokiem prawym. Strony index.html i twarz.html zapisane w języku HTML 5.
Zbuduj w całości index.html, a twarz.html powstanie z jej kopii z innym drugim blokiem prawym.
R.2.2 Witrynę internetową zapisano w plikach index.html i twarz.html oraz na stronie zastosowano deklarację języka HTML5 <!DOCTYPE html>, zadeklarowano język witryny polski np. <html lang = "pl"> oraz zapisano jawnie właściwy standard kodowania polskich znaków
R.2.2 Witrynę internetową zapisano w plikach index.html i twarz.html oraz na stronie zastosowano deklarację języka HTML5 <!DOCTYPE html>, zadeklarowano język witryny polski np. <html lang = "pl"> oraz zapisano jawnie właściwy standard kodowania polskich znaków
ok. 1 min
Polecenie z arkusza
Jawnie zastosowany właściwy standard kodowania polskich znaków.
R.3.5 Strona zawiera działające połączenie z zewnętrznym arkuszem stylów o nazwie styl7.css , formatowanie CSS pochodzi jedynie z tego arkusza Uwaga: kryterium to nie jest spełnione również, gdy zdający źle przypisał co najmniej jeden selektor do bloku (np. kropka zamiast #)
ok. 1 min
Polecenie z arkusza
Arkusz stylów w pliku o nazwie styl7.css prawidłowo połączony z kodem strony.
Uwaga na nazwę z cyfrą: styl7.css.
Typowe błędy
styl.css bez siódemki odcina wszystkie style (R.3.5).
R.2.4 Układ strony zdefiniowano dzieląc ją na bloki: dwa lewe, dwa prawe i stopkę. Zastosowano znaczniki sekcji
ok. 2 min
Polecenie z arkusza
Podział strony na bloki: dwa bloki po lewej stronie i dwa po prawej, poniżej stopka. Podział zrealizowany za pomocą znaczników sekcji tak, aby po uruchomieniu w przeglądarce układ bloków był zgodny z Obrazem 2.
Cztery <section> w kolejności kolumnami: najpierw oba lewe, potem oba prawe. Obejmuje je kontener <div id="container">, a stopka stoi pod nim.
Dlaczego tak, a nie float? Bloki lewe mają 400 i 330 px wysokości, a prawe 150 i 580 px - każdy wiersz byłby inny, więc pływające bloki rozjechałyby się. Kontener ułoży je w dwie kolumny w kroku układu CSS.
R.2.5 W bloku pierwszym lewym zapisano nagłówek h2: "Nasza oferta", w pierwszym prawym h1: "Usługi kosmetyczne" oraz w drugim prawym h3: "Telefon: 111 222 333" lub "Kalkulator ceny wizyty" oraz przynajmniej jeden paragraf
ok. 1 min
Polecenie z arkusza
Zawartość pierwszego bloku po lewej stronie: Nagłówek drugiego stopnia o treści „Nasza oferta”.
R.2.6 Umieszczono jedną trójelementową listę numerowaną, której pierwszy element zagnieżdża dwuelementową listę punktowaną, zastosowano znaczniki <ol>, <ul>, <li>. Podlista <ul> zawarta wewnątrz pierwszego <li> listy głównej
ok. 1 min
Polecenie z arkusza
Lista numerowana (uporządkowana) z elementami: Oczyszczanie twarzy, Masaż, Makijaż.
Lista uporządkowana to <ol> - numery wstawia przeglądarka.
R.2.6 Umieszczono jedną trójelementową listę numerowaną, której pierwszy element zagnieżdża dwuelementową listę punktowaną, zastosowano znaczniki <ol>, <ul>, <li>. Podlista <ul> zawarta wewnątrz pierwszego <li> listy głównej
ok. 2 min
Polecenie z arkusza
Element „Oczyszczanie twarzy” zawiera zagnieżdżoną listę punktowaną (nieuporządkowaną) z elementami: Peeling, Maska.
Zagnieżdżona lista stoi wewnątrz<li> - między tekstem „Oczyszczanie twarzy” a zamykającym </li>. Klucz sprawdza to wprost: podlista <ul> zawarta w pierwszym <li> listy głównej (R.2.6).
Typowe błędy
<ul> wstawione między dwa <li> (po zamknięciu pierwszego) to niepoprawny HTML i nie spełnia R.2.6.
R.2.5 W bloku pierwszym lewym zapisano nagłówek h2: "Nasza oferta", w pierwszym prawym h1: "Usługi kosmetyczne" oraz w drugim prawym h3: "Telefon: 111 222 333" lub "Kalkulator ceny wizyty" oraz przynajmniej jeden paragraf
ok. 1 min
Polecenie z arkusza
Zawartość pierwszego bloku po prawej stronie: nagłówek pierwszego stopnia o treści „Usługi kosmetyczne”.
R.2.7 Umieszczono co najmniej jedną grafikę: obraz1.jpg z tekstem alternatywnym "Personel" w bloku drugim lewym lub obraz2.jpg z tekstem alternatywnym "Zrelaksuj się" w bloku drugim prawym
ok. 1 min
Polecenie z arkusza
Zawartość drugiego bloku po lewej stronie: obraz o nazwie obraz1.jpg z tekstem alternatywnym „Personel”.
R.2.5 W bloku pierwszym lewym zapisano nagłówek h2: "Nasza oferta", w pierwszym prawym h1: "Usługi kosmetyczne" oraz w drugim prawym h3: "Telefon: 111 222 333" lub "Kalkulator ceny wizyty" oraz przynajmniej jeden paragraf
ok. 1 min
Polecenie z arkusza
Zawartość stopki: akapit (paragraf) o treści „Autor: ”, dalej wstawiony numer zdającego.
Na egzaminie po „Autor:” wpisujesz swój numer zdającego (PESEL), tu - autor rozwiązania.
R.2.5 W bloku pierwszym lewym zapisano nagłówek h2: "Nasza oferta", w pierwszym prawym h1: "Usługi kosmetyczne" oraz w drugim prawym h3: "Telefon: 111 222 333" lub "Kalkulator ceny wizyty" oraz przynajmniej jeden paragraf
R.2.7 Umieszczono co najmniej jedną grafikę: obraz1.jpg z tekstem alternatywnym "Personel" w bloku drugim lewym lub obraz2.jpg z tekstem alternatywnym "Zrelaksuj się" w bloku drugim prawym
ok. 2 min
Polecenie z arkusza
Zawartość drugiego bloku po prawej stronie dla strony index.html: Akapit (paragraf) o treści: „Witaj! Miło nam, że odwiedziłeś nasz salon. Zapoznaj się z ofertą lub skontaktuj się z nami.” Obraz o nazwie obraz2.jpg z tekstem alternatywnym „Zrelaksuj się”. Nagłówek trzeciego stopnia o treści „Telefon: 111 222 333”.
Akapit, obraz i <h3> - w tej kolejności, jak na obrazie 2.
R.2.5 W bloku pierwszym lewym zapisano nagłówek h2: "Nasza oferta", w pierwszym prawym h1: "Usługi kosmetyczne" oraz w drugim prawym h3: "Telefon: 111 222 333" lub "Kalkulator ceny wizyty" oraz przynajmniej jeden paragraf
ok. 2 min
Polecenie z arkusza
Wygląd drugiego bloku po prawej stronie dla twarz.html przedstawiono na Obrazie 3, jego zawartość to: Nagłówek trzeciego stopnia o treści „Kalkulator ceny wizyty”.
Zapisz jakotwarz.html z kopii strony głównej - wymieniasz tylko zawartość #right2. Reszta (lista, odnośniki, zdjęcie, stopka) zostaje identyczna, jak każe arkusz.
R.2.8 Na stronie twarz.html umieszczono cztery kontrolki checkbox z opisami: Peeling, Maska, Masaż twarzy, Makijaż oraz jeden przycisk "Oblicz cenę"
ok. 2 min
Polecenie z arkusza
Cztery pola checkbox jeden pod drugim z podpisami: Peeling, Maska, Masaż twarzy, Makijaż.
Każde pole z etykietą <label for> (kliknięcie podpisu zaznacza pole) i <br> po nim - dzięki temu pola stoją jedno pod drugim. Identyfikatory przydadzą się skryptowi.
R.2.8 Na stronie twarz.html umieszczono cztery kontrolki checkbox z opisami: Peeling, Maska, Masaż twarzy, Makijaż oraz jeden przycisk "Oblicz cenę"
R.3.4 Wybranie przycisku powoduje uruchomienie funkcji skryptu (obsługa zdarzenia zdefiniowana np. inline w znaczniku jako atrybut onClick lub w skrypcie JS np.: element.addEventListener("click", funkcja); lub element.onClick = …)
ok. 1 min
Polecenie z arkusza
Poniżej przycisk o treści „Oblicz cenę”, którego wybranie powoduje uruchomienie skryptu.
onclick="calculate()" wywoła funkcję skryptu, a pusty <p id="result"> pod przyciskiem przyjmie wynik. Przycisk nie stoi w formularzu, więc niczego nie wysyła.
R.4.2 Ustawiono kolor tła #E1BEE7 dla obu bloków lewych oraz #9C64A6 dla pierwszego bloku prawego i stopki
R.4.3 Ustawiono biały kolor czcionki dla pierwszego bloku prawego i stopki oraz Indigo dla drugiego bloku prawego
R.4.4 Ustawiono szerokość 25% dla obu bloków lewych i 75% dla obu prawych (width lub grid- template-columns lub flex)
R.4.5 Ustawiono wysokość dla bloków: pierwszy lewy: 400px, drugi lewy: 330px, pierwszy prawy: 150px, drugi prawy: 580px
R.4.7 Ustawiono wyrównanie do środka dla obu bloków prawych i selektora h2
R.4.8 Ustawiono dla obu bloków prawych rozmiar czcionki 170% oraz dla pierwszego prawego odstępy między literami 5px (letter-spacing)
ok. 3 min
Polecenie z arkusza
Wspólne dla obu bloków prawych: szerokość 75%, rozmiar czcionki 170%, wyrównanie tekstu do środka. Dodatkowo dla pierwszego bloku prawego: kolor tła #9C64A6, biały kolor czcionki, wysokość 150 px, odstępy między literami 5 px. Dodatkowo dla drugiego bloku prawego: kolor czcionki Indigo, wysokość 580 px.
Odstępy między literami to letter-spacing (między wyrazami byłoby word-spacing) - stąd rozstrzelony napis „Usługi kosmetyczne”.
R.4.2 Ustawiono kolor tła #E1BEE7 dla obu bloków lewych oraz #9C64A6 dla pierwszego bloku prawego i stopki
R.4.3 Ustawiono biały kolor czcionki dla pierwszego bloku prawego i stopki oraz Indigo dla drugiego bloku prawego
R.4.6 Ustawiono marginesy wewnętrzne (padding) 10px dla stopki, 4px dla selektora img i 25px dla odsyłacza do Strony głównej oraz marginesy zewnętrzne (margin) 15px dla selektora img
R.4.6 Ustawiono marginesy wewnętrzne (padding) 10px dla stopki, 4px dla selektora img i 25px dla odsyłacza do Strony głównej oraz marginesy zewnętrzne (margin) 15px dla selektora img
R.4.10 W momencie, gdy kursor znajduje się na obrazie, styl obrazu zmienia się na: marginesy wewnętrzne (padding) 3px oraz obramowanie 1px dashed Indigo
ok. 2 min
Polecenie z arkusza
Dla selektora obrazu: marginesy wewnętrzne 4 px, marginesy zewnętrzne 15 px. W momencie, gdy kursor znajduje się na obrazie, styl obrazu zmienia się na: marginesy wewnętrzne 3 px, obramowanie linią kreskową o szerokości 1 px i kolorze Indigo.
Linia kreskowa to dashed. Zauważ sztuczkę z arkusza: po wskazaniu margines wewnętrzny maleje o 1 px dokładnie wtedy, gdy pojawia się ramka 1 px - obraz zajmuje tyle samo miejsca i nic na stronie nie podskakuje. Najedź w podglądzie na obraz.
R.4.6 Ustawiono marginesy wewnętrzne (padding) 10px dla stopki, 4px dla selektora img i 25px dla odsyłacza do Strony głównej oraz marginesy zewnętrzne (margin) 15px dla selektora img
ok. 1 min
Polecenie z arkusza
Dla odsyłacza do Strony głównej: margines wewnętrzny 25 px.
Selektor identyfikatora #home - tylko ten jeden odnośnik.
R.3.1 Układ bloków po uruchomieniu przynajmniej jednej strony w przeglądarce jest zgodny z obrazem 2 w arkuszu (prawidłowo zastosowano właściwości CSS decydujące o układzie strony, np. float i clear albo display flex albo grid albo position)
ok. 3 min
Polecenie z arkusza
Podział strony na bloki: dwa bloki po lewej stronie i dwa po prawej, poniżej stopka. Podział zrealizowany za pomocą znaczników sekcji tak, aby po uruchomieniu w przeglądarce układ bloków był zgodny z Obrazem 2.
Kontener ustawiasz jako flex w kolumnie z zawijaniem: bloki układają się z góry na dół, a gdy kolumna się zapełni, następne przechodzą do nowej kolumny obok.
flex-direction: column - bloki jeden pod drugim,
flex-wrap: wrap - po zapełnieniu kolumny przejście do następnej,
height: 730px - wysokość kolumny: 400 + 330 px bloków lewych (i tyle samo 150 + 580 px prawych), więc oba lewe mieszczą się w pierwszej kolumnie, a prawe przechodzą do drugiej.
Szerokości 25% i 75% bloków dają razem cały wiersz.
Typowe błędy
float: left dla wszystkich czterech bloków nie zadziała przy różnych wysokościach: drugi blok lewy wskoczy obok pierwszego, pod pierwszy prawy.
R.5.2 Skrypt wykorzystuje przynajmniej jedną metodę DOM
R.5.3 Skrypt stosuje własność checked dla przynajmniej jednego pola checkbox
ok. 2 min
Polecenie z arkusza
Oblicza łączną cenę zabiegów wybranych za pomocą pól checkbox zgodnie z cennikiem w tabeli.
Zmienna sum zaczyna od zera. document.getElementById("peeling") znajduje pole, a jego właściwość checked jest true, gdy pole jest zaznaczone - wtedy doliczasz 45 zł z cennika.
Cztery osobneif, nie else if - zaznaczyć można dowolną liczbę zabiegów i każdy ma się doliczyć. Masaż twarzy kosztuje 20 zł (w cenniku „Masaż”).
Typowe błędy
else if liczy tylko pierwszy zaznaczony zabieg.
twarz.htmlHTMLzmienione: 9 linii
<!DOCTYPE html><htmllang="pl"><head> <metacharset="UTF-8"> <title>Salon kosmetyczny</title> <linkrel="stylesheet"href="styl7.css"></head><body> <divid="container"> <sectionid="left1"> <h2>Nasza oferta</h2> <ol> <li><ahref="twarz.html">Oczyszczanie twarzy</a> <ul> <li>Peeling</li> <li>Maska</li> </ul> </li> <li>Masaż</li> <li>Makijaż</li> </ol> <ahref="index.html"id="home">Strona główna</a> </section> <sectionid="left2"> <imgsrc="obraz1.jpg"alt="Personel"> </section> <sectionid="right1"> <h1>Usługi kosmetyczne</h1> </section> <sectionid="right2"> <h3>Kalkulator ceny wizyty</h3> <inputtype="checkbox"id="peeling"><labelfor="peeling">Peeling</label><br> <inputtype="checkbox"id="mask"><labelfor="mask">Maska</label><br> <inputtype="checkbox"id="massage"><labelfor="massage">Masaż twarzy</label><br> <inputtype="checkbox"id="makeup"><labelfor="makeup">Makijaż</label><br> <buttononclick="calculate()">Oblicz cenę</button> <pid="result"></p> </section> </div> <footer> <p>Autor: Bartosz Bryniarski</p> </footer> <script>function calculate() {let sum = 0;if (document.getElementById("peeling").checked) { sum = sum + 45; }if (document.getElementById("mask").checked) { sum = sum + 30; }if (document.getElementById("massage").checked) { sum = sum + 20; }if (document.getElementById("makeup").checked) { sum = sum + 50; } } </script></body></html>
Podgląd strony po tym kroku (twarz.html)
Krok 38: Wynik pod przyciskiem
Kryteria: ,
R.5.5 Skrypt wyświetla obliczony wynik w akapicie pod przyciskiem według wzoru: "Cena zabiegów: <suma>”, gdzie <suma> oznacza sumę wyliczoną przez skrypt
R.5.6 Zastosowano znaczące nazewnictwo dla wszystkich zmiennych i funkcji w języku polskim lub angielskim. Nazwy odzwierciedlają cel zastosowania
ok. 2 min
Polecenie z arkusza
Wyświetla wynik działania w akapicie pod przyciskiem według wzoru: „Cena zabiegów: <suma>”, gdzie <suma> oznacza całkowitą cenę wybranych zabiegów.
Wynik wpisujesz do akapitu result. Zaznacz w podglądzie Maskę, Masaż twarzy i Makijaż i kliknij „Oblicz cenę” - wyjdzie 100, jak na obrazie 3. Nazwy zmiennych i funkcji są po angielsku i mówią, co przechowują (R.5.6).
twarz.htmlHTMLzmienione: 1 linia
<!DOCTYPE html><htmllang="pl"><head> <metacharset="UTF-8"> <title>Salon kosmetyczny</title> <linkrel="stylesheet"href="styl7.css"></head><body> <divid="container"> <sectionid="left1"> <h2>Nasza oferta</h2> <ol> <li><ahref="twarz.html">Oczyszczanie twarzy</a> <ul> <li>Peeling</li> <li>Maska</li> </ul> </li> <li>Masaż</li> <li>Makijaż</li> </ol> <ahref="index.html"id="home">Strona główna</a> </section> <sectionid="left2"> <imgsrc="obraz1.jpg"alt="Personel"> </section> <sectionid="right1"> <h1>Usługi kosmetyczne</h1> </section> <sectionid="right2"> <h3>Kalkulator ceny wizyty</h3> <inputtype="checkbox"id="peeling"><labelfor="peeling">Peeling</label><br> <inputtype="checkbox"id="mask"><labelfor="mask">Maska</label><br> <inputtype="checkbox"id="massage"><labelfor="massage">Masaż twarzy</label><br> <inputtype="checkbox"id="makeup"><labelfor="makeup">Makijaż</label><br> <buttononclick="calculate()">Oblicz cenę</button> <pid="result"></p> </section> </div> <footer> <p>Autor: Bartosz Bryniarski</p> </footer> <script>function calculate() {let sum = 0;if (document.getElementById("peeling").checked) { sum = sum + 45; }if (document.getElementById("mask").checked) { sum = sum + 30; }if (document.getElementById("massage").checked) { sum = sum + 20; }if (document.getElementById("makeup").checked) { sum = sum + 50; }document.getElementById("result").innerHTML = "Cena zabiegów: " + sum; } </script></body></html>
Podgląd strony po tym kroku (twarz.html)
Etap 5: Dobre praktyki (poza kluczem)
Krok 39 · po tym etapie masz 35 z 35 kryteriów (pkt)
Krok 39: Ceny w HTML, jedna pętla zamiast czterech if
ok. 5 min
Polecenie z arkusza
Oblicza łączną cenę zabiegów wybranych za pomocą pól checkbox zgodnie z cennikiem w tabeli.
Wersja z egzaminu ma ceny wpisane w skrypt i osobny if dla każdego pola - nowy zabieg w ofercie to zmiana w dwóch miejscach. Teraz:
każde pole niesie swoją cenę w atrybucie data-price i ma wspólną klasę treatment,
skrypt przechodzi pętlą po document.querySelectorAll(".treatment") i dolicza Number(checkbox.dataset.price) z zaznaczonych pól - piąty zabieg to jedna linia HTML, bez zmian w skrypcie,
addEventListener zamiast onclick, textContent zamiast innerHTML (wpisujesz zwykły tekst).
Sprawdzone dla wszystkich 16 kombinacji pól - wyniki identyczne z wersją egzaminacyjną. Stary kod zostaje w komentarzu. Na egzaminie wystarczy wersja wcześniejsza - klucz tego nie sprawdza.
twarz.htmlHTMLzmienione: 29 linii
<!DOCTYPE html><htmllang="pl"><head> <metacharset="UTF-8"> <title>Salon kosmetyczny</title> <linkrel="stylesheet"href="styl7.css"></head><body> <divid="container"> <sectionid="left1"> <h2>Nasza oferta</h2> <ol> <li><ahref="twarz.html">Oczyszczanie twarzy</a> <ul> <li>Peeling</li> <li>Maska</li> </ul> </li> <li>Masaż</li> <li>Makijaż</li> </ol> <ahref="index.html"id="home">Strona główna</a> </section> <sectionid="left2"> <imgsrc="obraz1.jpg"alt="Personel"> </section> <sectionid="right1"> <h1>Usługi kosmetyczne</h1> </section> <sectionid="right2"> <h3>Kalkulator ceny wizyty</h3> <inputtype="checkbox"id="peeling"class="treatment"data-price="45"><labelfor="peeling">Peeling</label><br> <inputtype="checkbox"id="mask"class="treatment"data-price="30"><labelfor="mask">Maska</label><br> <inputtype="checkbox"id="massage"class="treatment"data-price="20"><labelfor="massage">Masaż twarzy</label><br> <inputtype="checkbox"id="makeup"class="treatment"data-price="50"><labelfor="makeup">Makijaż</label><br> <buttonid="calculate">Oblicz cenę</button> <pid="result"></p> </section> </div> <footer> <p>Autor: Bartosz Bryniarski</p> </footer> <script>// wersja z egzaminu - cztery osobne if z cenami w skrypcie// function calculate() {// let sum = 0;// if (document.getElementById("peeling").checked) {// sum = sum + 45;// }// if (document.getElementById("mask").checked) {// sum = sum + 30;// }// if (document.getElementById("massage").checked) {// sum = sum + 20;// }// if (document.getElementById("makeup").checked) {// sum = sum + 50;// }// document.getElementById("result").innerHTML = "Cena zabiegów: " + sum;// }function calculate() {let sum = 0;for (const checkbox ofdocument.querySelectorAll(".treatment")) {if (checkbox.checked) { sum += Number(checkbox.dataset.price); } }document.getElementById("result").textContent = "Cena zabiegów: " + sum; }document.getElementById("calculate").addEventListener("click", calculate); </script></body></html>
Podgląd strony po tym kroku (twarz.html)
Etap 6: Oddanie pracy
Krok 40 · po tym etapie masz 35 z 35 kryteriów (pkt)
Krok 40: Plik przeglądarka.txt i nagranie płyty
ok. 5 min
Polecenie z arkusza
Po zakończeniu pracy utwórz w folderze z numerem zdającego plik tekstowy o nazwie przeglądarka.txt. Zapisz w nim nazwę przeglądarki internetowej, w której weryfikowana była poprawność działania witryny. Nagraj płytę z rezultatami pracy.
W przeglądarka.txt wpisujesz nazwę przeglądarki.
W folderze: import.png, index.html, kw1.jpg - kw4.jpg, kwerendy.txt, obraz1.jpg, obraz2.jpg, przeglądarka.txt, styl7.css, twarz.html. Nagraj płytę, sprawdź jej odczyt i opisz ją numerem zdającego.
Symulacja ekranu w przeglądarce - w Android Studio / Visual Studio wygląd może się nieco różnić.
To jedno z możliwych rozwiązań. Egzaminator ocenia spełnienie kryteriów z klucza odpowiedzi, a nie zgodność z tym kodem - inna, poprawna droga też daje punkty.
Autor rozwiązania: Bartosz Bryniarski. Licencja CC BY-NC 4.0 - kopiowanie i przeróbki do celów niekomercyjnych, z podaniem autora i źródła (link do tej strony) (zasady wykorzystania). Treść arkusza i klucza oceniania pochodzi z CKE.