Tag: crud

  • Post #51 DB Test PHP MySql Apps

    Post #51 DB Test PHP MySql Apps

    DB Test PHP MySql Apps to prosta aplikacja z zapisem do bazy w środowisku lokalnym. Tworzę projekt edukacujnie i do portfolio. Będzie zawierał dobrą dokumentację jak to przećwiczyć na swoim środowisku lokalnym.

    Fukcjonalność jeszcze nieokkreślona

    Obecnie zawiera tablicę users służącą do logowania – uproszonego bez potwierdzania mailowego. Pole Bio użytkownika do edycji oraz sesję i drobny feauture pokazujący w Toast ile jest zalogowanych użytkowników.

    Dokumentacja Techniczna

    1. Konfiguracja Projektu

    Aby uruchomić projekt lokalnie, wykonałem następujące kroki:

    • Pobrałem i zainstalowałem XAMPP (lub inny lokalny serwer) na swoim komputerze.
    • Utworzyłem folder dla swojego projektu w katalogu htdocs (np. phpsandbox/test-baza).
    • Skopiowałem wszystkie pliki projektu, w tym index.php, register.php, login.php i about.php, do tego folderu.
    • Uruchomiłem Apache i MySQL w panelu sterowania XAMPP.
    • W przeglądarce przeszedłem do //localhost:3000/phpmyadmin, aby skonfigurować bazę danych.

    Konfiguracja Bazy Danych

    Aby skonfigurować bazę danych MySQL i utworzyć niezbędne tabele, wykonałem następujące kroki:

    Utworzyłem nową bazę danych o nazwie baza_test_login_data. W tej bazie danych utworzyłem tabelę o nazwie users z następującymi kolumnami: id – INT, klucz główny, autoinkrementacja firstName – VARCHAR(50), imię użytkownika secondName – VARCHAR(50), nazwisko użytkownika email – VARCHAR(100), unikalny, adres e-mail użytkownika password – VARCHAR(255), hasło bio – TEXT, opcjonalne pole na biografię użytkownika

    Rejestracja Użytkownika

    Plik register.php obsługuje rejestrację użytkownika. Działa w następujący sposób:

    Gdy użytkownik przesyła formularz rejestracyjny, jego dane wejściowe są walidowane, aby upewnić się, że wszystkie pola są wypełnione. Skrypt sprawdza, czy adres e-mail już istnieje w bazie danych. Jeśli tak, wyświetlane jest ostrzeżenie. Jeśli adres e-mail jest unikalny, dane użytkownika są zapisywane, a wyświetlany jest komunikat o sukcesie. Hasło jest przechowywane w postaci haszowanej dla bezpieczeństwa, przy użyciu funkcji password_hash().

    Logowanie Użytkownika

    Plik login.php umożliwia zalogowanie zarejestrowanym użytkownikom:

    Po przesłaniu formularza, adres e-mail i hasło są walidowane względem bazy danych. Jeśli dane uwierzytelniające są poprawne, użytkownik otrzymuje dostęp. Dla bezpieczeństwa funkcja password_verify() jest używana do porównania hasła haszowanego z bazą danych.

    Walidacja i Alerty

    Aby poprawić doświadczenie użytkownika, dodałem alerty Bootstrap dla komunikatów zwrotnych:

    Alert sukcesu: Wyświetlany, gdy użytkownik pomyślnie się zarejestruje. Alert ostrzeżenia: Wskazuje, że adres e-mail jest już używany podczas rejestracji. Alert błędu: Wyświetlany, jeśli wystąpi błąd podczas rejestracji.

    Pliki Kodu i Ich Funkcje

    index.php – Strona główna aplikacji. register.php – Zawiera formularz rejestracyjny i logikę PHP do dodawania użytkowników do bazy danych. login.php – Obsługuje logowanie użytkownika i uwierzytelnianie. about.php – Strona dokumentacji technicznej (ta strona). db.php – Zawiera kod połączenia z bazą danych przy użyciu mysqli. menu.php – Pasek nawigacyjny zawarty na każdej stronie dla łatwej nawigacji.

    Przykładowy Kod Połączenia z Bazą Danych

    Poniżej znajduje się przykład kodu używanego do połączenia z bazą danych w db.php:

    // ...
    $conn = mysqli_connect($servername, $username, $password, $dbname);
    
    // Check connection
    if (!$conn) {
        die("Connection failed: " . mysqli_connect_error());
    }
    // ...
    
    
    1. Bezpieczeństwo i Najlepsze Praktyki

    Hasła są haszowane przed przechowywaniem w bazie danych dla bezpieczeństwa. Pole e-mail jest unikalne w bazie danych, zapobiegając duplikatom rejestracji. Używane są przygotowane zapytania, aby zapobiec iniekcji SQL. Dla dodatkowego bezpieczeństwa należy rozważyć implementację SSL i zarządzania sesjami użytkowników.

  • Post #15 Teachers App Finished

    Post #15 Teachers App Finished

    Teachers App Finished

    Aplikacja ma pełną funkcjonalność CRUD. Została dodana do repozytorium jako nowy branch – z dopiskiem finished.

    Kilka słów o logice działania

    • Gradebook: Jak działa, jeśli nie czytałeś poprzednich postów Applikacja Teacher’s Grade book jest zrobiona z API studnetów i pliku logbook.json oraz Express.js Java Script i Bootsrap.
    • CRUD: na pierwszej stronie są dodane rekordy i wyświetlone w tabeli poniżej. Jest formularz do dodawania nowego studenta Imię Ocena ( A, B etc) oraz Wiek.
    • Po dodaniu: wyświetla się potwierdzenie oraz uaktulanienie tabeli. W tabeli jest klikalna ikona „Edit-Pencil”, która pobiera wybrane dane według uuid i przenosi na stronę Edycji. Dane są do poprawienia i zatwierdzenia. Tu znajduje się także przycisk Delete.
    • Tech: Express i plik logbook.json zapisują i manipulują metodami. Dodatkowo Id jest tworzone automatycznie dzięki uuid. Zastosowałem metodę reload oraz redirect po kliknięciu Dismiss alertu z powiadomieniem.

    API i Express

    Duże objaśniejie developerskie i rozwiązania manipulacji metodami znajdują się pliku readme.MD w repozytorium Scripterix w branch „finished” Branch main był zrobiony częściowo. GitHub Repo Teacher’s -b finished Metody API jakie są stosowane w Express.JS są omawiane w Post #22 API.

    Jestem zadowolony z pierwszego samodzielnego CRUD

    Oparcie Crud na API i endpointach dla danych mniej wrażliwych lub ogólnych i tworzenie warstwy Backendowej i Front-Endowej daje dużo frajdy i jest wielościeżkowe w sensie podejścia. Można wszystko zorganizować na kilka sposobów. Creativissimo

    App Teacher’s Grade logbook rozwinięcie

    Planuje albo użyć Webpack i zrobić „bundle” aby umieścić Appkę w Portfolio lub zastosować i poznać się lepiej z Docker’em. Jeśli chcesz poznać kod aplikacji zapraszam do Repo lub Glitch.

  • Post #13 CRUD

    Post #13 CRUD

    13 App Teachers Grade book

    Aplikacja CRUD Teacher’s Grade book posiada już konkretny kształt i jest zorganizowana na poziomie Read i Create. Express i Node świetnie współpracują. App jest szybka jak lubię.

    Skrypt pobiera dane studentów z serwera i wyświetla je w tabeli podczas ładowania strony fetch(). Nasłuchuje również na przesłanie formularza, aby dodać nowego studenta. Gdy formularz zostanie przesłany, wysyła żądanie POST do serwera z danymi nowego studenta i dodaje nowego studenta do tabeli. Nowy student pojawia się w tabeli, powiadomienia o działaniu są w postaci Alertów Bootstrap.

    Aby dodać nowego studenta do tabeli natychmiast po przesłaniu formularza, używamy nasłuchiwanie zdarzeń przesłania formularza irównież tworzymy nowy wiersz tabeli dla nowego studenta aby dołączać go do tabeli.

    Oto logika aplikacji :

    Gdy formularz zostanie przesłany, zapobiegamy domyślnemu zachowaniu przesłania formularza.

    • Pobierz wartości pól wejściowych i utwórz nowy obiekt studenta.
    • Wyślij żądanie POST do serwera z danymi nowego studenta.
    • Jeśli żądanie POST zakończy się sukcesem, utwórz nowy wiersz tabeli dla nowego studenta i dołącz go do tabeli.
    • Zaloguj odpowiedź serwera i wyczyść pola formularza.
    • Jeśli wystąpi błąd, zaloguj błąd.
    • Jeśli chodzi o alert, używamy go do wyświetlenia okna alertu z komunikatem o dodaniu studenta.

    Dodałem funkcjonalność fetch() Crud R

    Dane są pobierane i wyświetlane w tabeli. fetch() jest w części main.js i ustalone jako endpoint localhost:3000/api/student

    Dodałem funcjonalność Crud C

    Funcjonalność Create student została dodana. Dodane Id poza na razie istnieje poza generacją skryptem. Zostaną zastąpioone po dopisaniu D Delete Jeśli dodajemy nowego studenta dodaje prawidłowy uuid z Library uuid v.4.

    logbook.json

    {
      "students": [
        {
          "id": "<uuid>",
          "name": "John",
          "grade": "A",
          "age": 18
        },
        {
          "id": "<uuid>",
          "name": "Emily",
          "grade": "B",
          "age": 17
        },
        {
          "id": "<uuid>",
          "name": "Michael",
          "grade": "C",
          "age": 16
        },
        {
          "name": "Piotr",
          "grade": "A",
          "age": "55",
          "id": "1dd4d74b-ddb6-4e87-b2f8-9fc04e91ad3a"
        },
        {
          "name": "Tom",
          "grade": "B",
          "age": "8",
          "id": "c7fe0ea0-434e-410d-b919-d427949736ff"
        }
      ]
    }
    
    

    Kod dla server.js i kod logiki main.js

    server.js

    express = require('express');
    const { v4: uuidv4 } = require('uuid');
    const fs = require('fs');
    const path = require('path');
    
    const app = express();
    
    // Middleware to parse JSON bodies
    app.use(express.json());
    
    // Serve static files from the public directory
    app.use(express.static(path.join(__dirname, 'public')));
    
    // Read the logbook.json file and parse it as JSON
    const data = JSON.parse(fs.readFileSync(path.join(__dirname, 'logbook.json'), 'utf-8'));
    
    // API endpoint to get all students
    app.get('/api/students', (req, res) => {
      res.json(data.students);
    });
    
    // API endpoint to add a new student
    app.post('/api/students', (req, res) => {
      // Get the new student data from the request body
      const newStudent = req.body;
    
      // Add a unique id to the new student
      newStudent.id = uuidv4();
    
      // Add the new student to the data
      data.students.push(newStudent);
    
      // Write the updated data back to the logbook.json file
      fs.writeFileSync(path.join(__dirname, 'logbook.json'), JSON.stringify(data, null, 2));
    
      // Send the new student data back as the response
      res.json(newStudent);
    });
    
    app.listen(3000);
    console.log('Listening on port 3000');
    
    
    
    
    

    main.js

    // Fetch the student data from the API
    const form = document.querySelector('#studentForm');
    const studentName = document.querySelector('#name');
    const studentGrade = document.querySelector('#grade');
    const studentAge = document.querySelector('#age');
    const submitButton = document.querySelector('#submit');
    const alertSuccess = document.querySelector('#alertSuccess');
    const alertDanger = document.querySelector('#alertDanger');
    
    fetch('/api/students')
      .then(response => response.json())
      .then(data => {
        // Get the table body to insert the student data into
        const tableBody = document.querySelector('#student-table tbody');
    
        // Loop over each student in the data
        for (const student of data) {
          // Create a new table row for the student
          const tr = document.createElement('tr');
    
          // Create table data for each piece of student data
          const nameTd = document.createElement('td');
          nameTd.textContent = student.name;
          tr.appendChild(nameTd);
    
          const gradeTd = document.createElement('td');
          gradeTd.textContent = student.grade;
          tr.appendChild(gradeTd);
    
          const ageTd = document.createElement('td');
          ageTd.textContent = student.age;
          tr.appendChild(ageTd);
    
          // Append the table row to the table body
          tableBody.appendChild(tr);
        }
      });
    
    // Function to add a new student
    form.addEventListener('submit', (event) => {
      // Prevent the form from being submitted normally
      event.preventDefault();
    
      // Get the values of the input fields
      const name = studentName.value;
      const grade = studentGrade.value;
      const age = studentAge.value;
    
      // Create a new student object
      const newStudent = {
        name: name,
        grade: grade,
        age: age
      };
    
      // Send a POST request to the API with the new student's data
      fetch('/api/students', {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
        },
        body: JSON.stringify(newStudent),
      })
        .then(response => {
          if (!response.ok) {
            throw new Error(`HTTP error! status: ${response.status}`);
          }
          return response.json();
        })
        .then(data => {
          // Log the response from the API
          console.log('Success:', data);
    
          // Show the success alert
          alertSuccess.hidden = false;
    
          // Add the new student to the table
          const tableBody = document.querySelector('#student-table tbody');
          const tr = document.createElement('tr');
    
          const nameTd = document.createElement('td');
          nameTd.textContent = data.name;
          tr.appendChild(nameTd);
    
          const gradeTd = document.createElement('td');
          gradeTd.textContent = data.grade;
          tr.appendChild(gradeTd);
    
          const ageTd = document.createElement('td');
          ageTd.textContent = data.age;
          tr.appendChild(ageTd);
    
          tableBody.appendChild(tr);
    
          // Clear the form fields
          studentName.value = '';
          studentGrade.value = '';
          studentAge.value = '';
        })
        .catch((error) => {
          console.error('Error:', error);
    
          // Show the danger alert
          alertDanger.hidden = false;
        });
    });
    
    // Reload the page when the success alert is dismissed
    alertSuccess.querySelector('.btn-close').addEventListener('click', () => {
      location.reload();
    });
    
    // Reload the page when the danger alert is dismissed
    alertDanger.querySelector('.btn-close').addEventListener('click', () => {
      location.reload();
    });
    
    

    Więcej objaśnień na temat API i JSON z Express jest postach poprzenich.

    Dodatkowo dla ambitnych Advance Usage Express The Medium Article w tym arykule znajdziesz:

    „5 Zaawansowanych Technik NodeJS z ExpressJS”:

    • Dodawanie Pośredników (Middleware)
    • Używanie Globalnego Obsługi Błędów
    • Użycie Niższych Funkcji Try-Catch
    • Oddzielenie Głównego Pliku na Dwie Części
    • Oddzielenie Tras od Kontrolerów

    Post #11 API

    Post #12 App Teachers Grade Book

    GitHub commands practice

    Od dobrej powtórki GitHub czyli Git versjononowanie i praca z repozytorium większość projektów jest przesyłana na GitHub lub tworzone są Gist do ponownego wykorzystania.

    Git Hub Repositorium

    Więcej o Git i Gist w poniższym poście.

    GitHub commands

    Od dobrej powtórki GitHub czyli Git versjononowanie i praca z repozytorium większość projektów jest przesyłana na GitHub lub tworzone są Gist do ponownego wykorzystania.

    Git Hub Repositorium