Zrobimy najprostsze możliwe rozwiązanie przy użyciu:
Zacznijmy od kompletnego MVP.
project/
│
├── backend/
│ ├── server.js
│ └── db.sqlite (utworzy się automatycznie)
│
└── frontend/
└── (tu będzie React)
backend/server.js
const express = require('express');
const sqlite3 = require('sqlite3').verbose();
const cors = require('cors');
const app = express();
const db = new sqlite3.Database('./db.sqlite');
app.use(cors());
app.use(express.json());
// Tworzenie tabeli jeśli nie istnieje
db.run(`
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT NOT NULL,
department TEXT NOT NULL
)
`);
// Dodawanie użytkownika
app.post('/users', (req, res) => {
const { name, email, department } = req.body;
if (!name || !email || !department) {
return res.status(400).json({ error: 'All fields are required' });
}
db.run(
'INSERT INTO users (name, email, department) VALUES (?, ?, ?)',
[name, email, department],
function (err) {
if (err) return res.status(500).json({ error: err.message });
res.status(201).json({ id: this.lastID });
}
);
});
// Lista użytkowników
app.get('/users', (req, res) => {
db.all('SELECT * FROM users', (err, rows) => {
if (err) return res.status(500).json({ error: err.message });
res.json(rows);
});
});
app.listen(3001, () => console.log('Backend działa na http://localhost:3001'));
frontend/src/App.js
import { useState, useEffect } from 'react';
export default function App() {
const [users, setUsers] = useState([]);
const [form, setForm] = useState({ name: '', email: '', department: '' });
const [message, setMessage] = useState('');
const fetchUsers = () => {
fetch('http://localhost:3001/users')
.then(res => res.json())
.then(data => setUsers(data));
};
useEffect(() => {
fetchUsers();
}, []);
const handleChange = (e) => {
setForm({ ...form, [e.target.name]: e.target.value });
};
const handleSubmit = (e) => {
e.preventDefault();
if (!form.name || !form.email || !form.department) {
setMessage('Wszystkie pola są wymagane');
return;
}
fetch('http://localhost:3001/users', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(form)
})
.then(res => {
if (!res.ok) throw new Error('Błąd podczas dodawania');
return res.json();
})
.then(() => {
setMessage('Pracownik dodany');
setForm({ name: '', email: '', department: '' });
fetchUsers();
})
.catch(() => setMessage('Błąd'));
};
return (
<div style=>
<h2>Dodaj pracownika</h2>
<form onSubmit={handleSubmit}>
<input name="name" placeholder="Imię" value={form.name} onChange={handleChange} /><br />
<input name="email" placeholder="Email" value={form.email} onChange={handleChange} /><br />
<input name="department" placeholder="Dział" value={form.department} onChange={handleChange} /><br />
<button type="submit">Zapisz</button>
</form>
<p>{message}</p>
<h2>Lista pracowników</h2>
<ul>
{users.map(user => (
<li key={user.id}>
{user.name} ({user.email}) - {user.department}
</li>
))}
</ul>
</div>
);
}
frontend/index.html + konfiguracja przez Vite / CRA lub inny sposób, zależnie od preferencji.
POST /users
Chcesz, żebym przygotował plik package.json
i komendy startowe?