<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Sak Up</title>
    <description>The latest articles on Forem by Sak Up (@sak_up_37a199dee68e412c0c).</description>
    <link>https://forem.com/sak_up_37a199dee68e412c0c</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3545560%2Fba923cb6-5d06-4ac4-b3e5-0fb7f92483e3.png</url>
      <title>Forem: Sak Up</title>
      <link>https://forem.com/sak_up_37a199dee68e412c0c</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/sak_up_37a199dee68e412c0c"/>
    <language>en</language>
    <item>
      <title>📚Library Management System</title>
      <dc:creator>Sak Up</dc:creator>
      <pubDate>Sat, 04 Oct 2025 18:14:03 +0000</pubDate>
      <link>https://forem.com/sak_up_37a199dee68e412c0c/library-management-system-4081</link>
      <guid>https://forem.com/sak_up_37a199dee68e412c0c/library-management-system-4081</guid>
      <description>&lt;p&gt;&lt;strong&gt;Step 1: Setup Project&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npx create-react-app library-crud&lt;br&gt;
cd library-crud&lt;br&gt;
npm install axios&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Step 2: Setup JSON Server&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Install JSON Server globally (or as dev dependency):&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm install -g json-server&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Create a db.json file in the root folder (outside src/):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "books": [
    { "id": 1, "title": "Atomic Habits", "author": "James Clear", "year": 2018 },
    { "id": 2, "title": "The Alchemist", "author": "Paulo Coelho", "year": 1988 }
  ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Run the server:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;json-server --watch db.json --port 5000&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Your API will run at 👉 &lt;code&gt;http://localhost:5000/books&lt;/code&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Step 3: Folder Structure&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;src/&lt;br&gt;
 ┣ api/&lt;br&gt;
 ┃ ┗ bookApi.js&lt;br&gt;
 ┣ components/&lt;br&gt;
 ┃ ┣ BookCard.jsx&lt;br&gt;
 ┃ ┣ BookForm.jsx&lt;br&gt;
 ┃ ┗ BookList.jsx&lt;br&gt;
 ┣ App.jsx&lt;br&gt;
 ┣ index.js&lt;br&gt;
 ┗ App.css&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Step 4: API Handling with Axios&lt;/strong&gt; (src/api/bookApi.js)&lt;/p&gt;

&lt;p&gt;&lt;code&gt;import axios from "axios";&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
const API = "&lt;a href="http://localhost:5000/books" rel="noopener noreferrer"&gt;http://localhost:5000/books&lt;/a&gt;";&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// GET all books
export const getBooks = async () =&amp;gt; {
  return await axios.get(API);
};

// GET single book
export const getBook = async (id) =&amp;gt; {
  return await axios.get(`${API}/${id}`);
};

// POST new book
export const addBook = async (book) =&amp;gt; {
  return await axios.post(API, book);
};

// PUT update book
export const updateBook = async (id, book) =&amp;gt; {
  return await axios.put(`${API}/${id}`, book);
};

// DELETE book
export const deleteBook = async (id) =&amp;gt; {
  return await axios.delete(`${API}/${id}`);
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;*&lt;em&gt;Step 5: Components&lt;br&gt;
*&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;BookCard.jsx
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React from "react";

const BookCard = ({ book, onDelete, onEdit }) =&amp;gt; {
  return (
    &amp;lt;div className="p-4 border rounded-lg shadow-md bg-white flex justify-between items-center"&amp;gt;
      &amp;lt;div&amp;gt;
        &amp;lt;h2 className="text-lg font-bold"&amp;gt;{book.title}&amp;lt;/h2&amp;gt;
        &amp;lt;p className="text-gray-600"&amp;gt;{book.author} ({book.year})&amp;lt;/p&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;div&amp;gt;
        &amp;lt;button 
          onClick={() =&amp;gt; onEdit(book)} 
          className="px-3 py-1 bg-blue-500 text-white rounded mr-2"&amp;gt;
          Edit
        &amp;lt;/button&amp;gt;
        &amp;lt;button 
          onClick={() =&amp;gt; onDelete(book.id)} 
          className="px-3 py-1 bg-red-500 text-white rounded"&amp;gt;
          Delete
        &amp;lt;/button&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};

export default BookCard;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;ol&gt;
&lt;li&gt;BookForm.jsx
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React, { useState, useEffect } from "react";

const BookForm = ({ onSubmit, currentBook }) =&amp;gt; {
  const [book, setBook] = useState({ title: "", author: "", year: "" });

  useEffect(() =&amp;gt; {
    if (currentBook) {
      setBook(currentBook);
    }
  }, [currentBook]);

  const handleChange = (e) =&amp;gt; {
    setBook({ ...book, [e.target.name]: e.target.value });
  };

  const handleSubmit = (e) =&amp;gt; {
    e.preventDefault();
    onSubmit(book);
    setBook({ title: "", author: "", year: "" });
  };

  return (
    &amp;lt;form onSubmit={handleSubmit} className="p-4 bg-gray-100 rounded-lg shadow-md mb-4"&amp;gt;
      &amp;lt;input 
        type="text" name="title" placeholder="Title" value={book.title} 
        onChange={handleChange} className="border p-2 mr-2" required 
      /&amp;gt;
      &amp;lt;input 
        type="text" name="author" placeholder="Author" value={book.author} 
        onChange={handleChange} className="border p-2 mr-2" required 
      /&amp;gt;
      &amp;lt;input 
        type="number" name="year" placeholder="Year" value={book.year} 
        onChange={handleChange} className="border p-2 mr-2" required 
      /&amp;gt;
      &amp;lt;button type="submit" className="px-4 py-2 bg-green-500 text-white rounded"&amp;gt;
        {currentBook ? "Update" : "Add"} Book
      &amp;lt;/button&amp;gt;
    &amp;lt;/form&amp;gt;
  );
};

export default BookForm;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;ol&gt;
&lt;li&gt;BookList.jsx
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React, { useEffect, useState } from "react";
import BookCard from "./BookCard";
import BookForm from "./BookForm";
import { getBooks, addBook, updateBook, deleteBook } from "../api/bookApi";

const BookList = () =&amp;gt; {
  const [books, setBooks] = useState([]);
  const [currentBook, setCurrentBook] = useState(null);

  const loadBooks = async () =&amp;gt; {
    const response = await getBooks();
    setBooks(response.data);
  };

  useEffect(() =&amp;gt; {
    loadBooks();
  }, []);

  const handleAddOrUpdate = async (book) =&amp;gt; {
    if (currentBook) {
      await updateBook(currentBook.id, book);
      setCurrentBook(null);
    } else {
      await addBook(book);
    }
    loadBooks();
  };

  const handleDelete = async (id) =&amp;gt; {
    await deleteBook(id);
    loadBooks();
  };

  const handleEdit = (book) =&amp;gt; {
    setCurrentBook(book);
  };

  return (
    &amp;lt;div className="max-w-2xl mx-auto mt-10"&amp;gt;
      &amp;lt;h1 className="text-2xl font-bold mb-4 text-center"&amp;gt;📚 Library Management&amp;lt;/h1&amp;gt;
      &amp;lt;BookForm onSubmit={handleAddOrUpdate} currentBook={currentBook} /&amp;gt;
      &amp;lt;div className="space-y-3"&amp;gt;
        {books.map((book) =&amp;gt; (
          &amp;lt;BookCard key={book.id} book={book} onDelete={handleDelete} onEdit={handleEdit} /&amp;gt;
        ))}
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};

export default BookList;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;p&gt;Step 6: App.jsx&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React from "react";
import BookList from "./components/BookList";
import "./App.css";

function App() {
  return (
    &amp;lt;div className="App bg-gray-50 min-h-screen"&amp;gt;
      &amp;lt;BookList /&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

export default App;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Step 7: Run Project&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm start&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;and in another terminal:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;json-server --watch db.json --port 5000&lt;/code&gt;&lt;/p&gt;




&lt;p&gt;Here is the output of the above code&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu1pgele0wv9bny8qhwhy.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu1pgele0wv9bny8qhwhy.jpg" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>beginners</category>
      <category>career</category>
      <category>react</category>
    </item>
    <item>
      <title>Create a new crud project</title>
      <dc:creator>Sak Up</dc:creator>
      <pubDate>Sat, 04 Oct 2025 17:41:45 +0000</pubDate>
      <link>https://forem.com/sak_up_37a199dee68e412c0c/create-a-new-crud-project-b4j</link>
      <guid>https://forem.com/sak_up_37a199dee68e412c0c/create-a-new-crud-project-b4j</guid>
      <description></description>
      <category>database</category>
      <category>tutorial</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
