Aplikacja ma być bazą informacji o sprzęcie IT używanym w firmie. Gromadzone informacje mają obejmować:
Szczegółowe informacje o parametrach sprzętu
Informacje o lokalizacji sprzętu w budynku
Podstawowe informacje o użytkownikach aplikacji i uprawnieniach
Historię operacji wykonywanych w aplikacji
Stara wersja aplikacji wyglądała tak:
Nowa wersja ma działać na tej samej bazie danych. Stara baza danych wygląda tak:
CREATETABLE`urzadzenia` (`id`int(11) NOTNULL,`uwiw` text NOTNULL,`kategoria` text NOTNULL,`sala` text NOTNULL,`lpwsali` text NOTNULL,`model` text NOTNULL,`wyglad` text NOTNULL,`procesor` text NOTNULL,`ram` text NOTNULL,`plyta` text NOTNULL,`dysk` text NOTNULL,`przekatna` text NOTNULL,`mac` text NOTNULL,`licencje` text NOTNULL,`inne` text NOTNULL,PRIMARYKEY (`id`)) ENGINE=InnoDB DEFAULTCHARSET=latin2;CREATETABLE`uzytkownicy` (`id`int(9) NOTNULLAUTO_INCREMENT,`login` text NOTNULL,`imie` text NOTNULL,`nazwisko` text NOTNULL,`ranga` text NOTNULL,`has` text NOTNULL,PRIMARYKEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=18DEFAULTCHARSET=latin2;CREATETABLE`wydarzenia` (`id`int(11) NOTNULLAUTO_INCREMENT,`id_urzadzenia`int(11) NOTNULL,`data` date DEFAULTNULL,`typ_wydarzenia` text NOTNULL,`opis` text NOTNULL,`status` text NOTNULL,`ip` text,`user` text,`dataczas` datetime DEFAULTNULL,PRIMARYKEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=4243DEFAULTCHARSET=latin2;//Fragment przykładowych danychINSERTINTO`urzadzenia`VALUES (1,'S_UW/IW/367','serwer','324 zapl','1','','Serwer Dell','Xeon','1GB','','','','','ws2003',''),(2,'ZZS S_UWIW 218','serwer','308z','1','','Serwer Dell','Xeon','1GB','','','','','ws2003',''),(3,'S_UW/IW/176','serwer','308z','2','','Serwer SkĹadak','','','','2 hdd 160GB','','','',''),(4,'S_UWIW','serwer','308z','','MAC serwer Model A1186 EMC No: 2113','Srebrny MAC','','1GB?','','hdd 160GB?','','','OSX',''),(5,'UWIW 459,457,456','serwer','308z','3','NAS Qnap TS-219P?','NAS','','','','2 hdd 1TB','','','QOS',''),(6,'UW/IW/632','serwer','308z','4','NAS Qnap TS-669PRO','NAS','Intel Atom D2700 2130 MHz','1GB','','6 hdd 2TB','','','QOS',''),(7,'UW/IW/633','serwer','308z','5','HP ML310eGen8v2','','Xeon E3-1240v3','16GB','','2 hdd 2TB','','','ws2012 HyperVcore',''),(8,'UWIW/552','komputer','322','1','stacjonarny i5-4430 GA-B85M','Brutus','i5 4430 3GHz','8GB','Gigabyte GA-B85M-HD3','HDD 500GB wcc1u3907310','','94-DE-80-B5-77-92','w7hoem','Kupione z obudowami Logic teraz obudowy Brutus');)INSERTINTO`wydarzenia`VALUES (1,1,'1980-01-01','zakup','data niepewna','potwierdzony','10.1.1.1','admi','2018-01-01 07:00:00'),(2,2,'1980-01-01','zakup','data niepewna','potwierdzony','10.1.1.1','admi','2018-01-01 07:00:00'),(3,3,'1980-01-01','zakup','data niepewna','potwierdzony','10.1.1.1','admi','2018-01-01 07:00:00'),(4,4,'2007-01-01','zakup','data niepewna','potwierdzony','10.1.1.1','admi','2018-01-01 07:00:00'),(5,5,'2012-01-01','zakup','','potwierdzony','10.1.1.1','admi','2018-01-01 07:00:00'),(6,6,'2015-01-01','zakup','','potwierdzony','10.1.1.1','admi','2018-01-01 07:00:00'),(7,7,'2015-01-01','zakup','','potwierdzony','10.1.1.1','admi','2018-01-01 07:00:00'),(8,8,'2013-09-01','zakup','','potwierdzony','10.1.1.1','admi','2018-01-01 07:00:00'),(9,9,'2013-09-01','zakup','','potwierdzony','10.1.1.1','admi','2018-01-01 07:00:00'),(10,10,'2013-09-01','zakup','','potwierdzony','10.1.1.1','admi','2018-01-01 07:00:00'),(11,11,'2013-09-01','zakup','','potwierdzony','10.1.1.1','admi','2018-01-01 07:00:00');)
Etap 1 – API
Utwórz instalator tworzący bazą danych wraz z danymi testowymi.
Zaprojektuj i napisz REST API w PHP. Dane przekazywać będziemy jako json. Wykonaj testy.
Etap 2 – Szkielet frontendu
Utwórz w HTML i CSS layout zgodny z layoutem starej wersji:
Wykorzystaj bibliotekę Bootstrap
Wypełnij statycznymi danymi
Zbuduj wygląd głównej tabeli (dynamiczne komponenty aplikacji utworzymy później). Użyj css grid w oparciu o Bootstrapa lub np. tak jak w tym queście
W nagłówku zaplanuj miejsce na komponent nawigacji i na komponent filtrów
W stopce zaplanuj miejsce na komponent statystyk/liczników
Zadbaj o responsywność
Etap 3 – Struktura aplikacji React
Na bazie przygotowanego szkieletu HTML utwórz strukturę aplikacji React (Vite):
plik index.html
plik src/index.css
plik src/main.jsx
plik src/App.jsx
plik src/App.css
Komponenty należy tworzyć w src/components. Nazwa pliku to nazwa komponentu – zawsze zaczyna się od dużej litery. Style css komponentu wstawiaj w osobnych plikach o tej samej nazwie.
Przenieś statyczne treści ze szkieletu do odpowiednio nazwanych komponentów. Podziel też css.
Etap 4 – połączanie z API
Główną tabelę aplikacji napełnij danymi z bazy danych poprzez API.
Zadanie polega na zbudowaniu, uruchomieniu i przetestowaniu prostego CRUD API oraz uruchomieniu frontendu testowego w React. Załóżmy że chcemy przechowywać w bazie danych informacje o produktach (nazwa, opis, cena). Użyjemy Node.js + Express.js + MySQL + mysql. Dane będziemy przekazywać i odbierać jako json.
Prosty serwer na Node
Zainstaluj wymagane zależności:
cd katalog
npm init -y
npm install express mysql cors
Utwórz bazę w MySQL (np w XAMPP przez PhpMyAdmin) Stwórz i uruchom plik app.js z następującą zawartością:
constexpress=require('express');constmysql=require('mysql');constcors=require('cors');// Tworzenie aplikacji Expressconstapp=express();// Dzieki tej bibliotece będzie łatwiej. To takie obejście dla Same-Origin Policy w przeglądarce.app.use(cors());// Middleware do parsowania JSON (Express ma wbudowany parser JSON od wersji 4.16)app.use(express.json());// Konfiguracja połączenia z bazą danychconstdb= mysql.createConnection({ host: 'localhost', user: 'root', // Zmień na swojego użytkownika password: '', // Ustaw swoje hasło database: 'products_db', // Ustaw nazwę swojej bazy danych});// Połączenie z bazą danychdb.connect((err) => {if (err) { console.error('Błąd połączenia z bazą danych:', err.message);return; } console.log('Połączono z bazą danych MySQL.');});// Tworzenie tabeli w bazie danych (jeśli nie istnieje)constcreateTableQuery=` CREATE TABLE IF NOT EXISTS products ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, description TEXT, price DECIMAL(10, 2) NOT NULL );`;db.query(createTableQuery, (err) => {if (err) throw err; console.log('Tabela "products" została utworzona.');});// Endpointy API// 1. Pobierz wszystkie produktyapp.get('/products', (req, res) => {constquery='SELECT * FROM products'; db.query(query, (err, results) => {if (err) { res.status(500).send(err.message);return; } res.json(results); });});// 2. Pobierz produkt po IDapp.get('/products/:id', (req, res) => {constquery='SELECT * FROM products WHERE id = ?'; db.query(query, [req.params.id], (err, results) => {if (err) { res.status(500).send(err.message);return; }if (results.length===0) { res.status(404).send('Produkt nie został znaleziony.');return; } res.json(results[0]); });});// 3. Dodaj nowy produktapp.post('/products', (req, res) => {const { name, description, price } = req.body;constquery='INSERT INTO products (name, description, price) VALUES (?, ?, ?)'; db.query(query, [name, description, price], (err, result) => {if (err) { res.status(500).send(err.message);return; } res.status(201).send({ id: result.insertId, name, description, price }); });});// 4. Aktualizuj produktapp.put('/products/:id', (req, res) => {const { name, description, price } = req.body;constquery='UPDATE products SET name = ?, description = ?, price = ? WHERE id = ?'; db.query(query, [name, description, price, req.params.id], (err, result) => {if (err) { res.status(500).send(err.message);return; }if (result.affectedRows ===0) { res.status(404).send('Produkt nie został znaleziony.');return; } res.send('Produkt został zaktualizowany.'); });});// 5. Usuń produktapp.delete('/products/:id', (req, res) => {constquery='DELETE FROM products WHERE id = ?'; db.query(query, [req.params.id], (err, result) => {if (err) { res.status(500).send(err.message);return; }if (result.affectedRows ===0) { res.status(404).send('Produkt nie został znaleziony.');return; } res.send('Produkt został usunięty.'); });});// Uruchomienie serweraconstPORT=3000;app.listen(PORT, () => { console.log(`Serwer działa na porcie ${PORT}`);});
Testowanie API
Użyj gotowych narzędzi do testowania API. Proponuję Postman. W wersji bezpłatnej, bez zakładania konta, można wykonać wszystkie testy. Aby na przykład dodać dane do bazy za pomocą Postman:
Wybierz metodę POST.
Wprowadź URL: http://localhost:3000/products.
Przejdź do zakładki Body, wybierz opcję raw i jako format wybierz JSON. Wklej: { "name": "Produkt A", "description": "Opis produktu A", "price": 99.99 }
Kliknij Send.
Frontend w React
Kolejny krok to uruchomienie aplikacji React wykorzystującej nasze API. Najpierw trzeba przygotować środowisko:
cd /home/piotr/sand/react_frontend_4_simple_api
npm create vite@latest my-app --template react
cd my-app
npm install
npm install axios
npm install bootstrap
npm run dev