Showing posts with label ReactJS. Show all posts
Showing posts with label ReactJS. Show all posts

Sunday, August 14, 2022

CRUD MySQL dengan ReactJS - III [ Finish ]

 

Berikut adalah tahap Finishing dari project React :

pada tahap ini merupakan tahap terakhir untuk menyatukan proses dalam project React pada pembuatan CRUD dengan MySql

Buka dan modif file “App.js” pada folder “frontend/src”,  seperti dibawah ini :

import { BrowserRouter as Router, Route, Switch } from "react-router-dom";

import ProductList from "./components/ProductList";

import AddProduct from "./components/AddProduct";

import EditProduct from "./components/EditProduct";

function App() {

  return (

    <Router>

    <div className="container">

      <div className="columns">

        <div className="column is-half is-offset-one-quarter">

          <Switch>

            <Route exact path="/">

              <ProductList />

            </Route>

            <Route path="/add">

              <AddProduct />

            </Route>

            <Route path="/edit/:id">

              <EditProduct />

            </Route>

          </Switch>

        </div>

      </div>

    </div>

    </Router>

  );

}

export default App;

Setelah semua telah dilakukan, maka tahap selanjutnya adalah menguji project tersebut, buka browser ketikan : http://localhost:3000 ,  tampllan awal adalah seperti gambar dibawah :


Tahap menguji project :

1.  Klik Add New


Isikan data product baru, lalu klik save, maka hasilnya adalah :



2.  Pilih Product New, lalu klik Edit, kemudian ganti nama dan harga


Setelah diklik Update, maka akan seperti gambar dibawah :


3. Pilih salah satu ( Producr Updated ), lalu klik Delete, maka akan ditampilkan seperti gambar dibawah 


Catatan :

pada artikel ini merupakan lanjutan dari pembuatan Front-End, yang bisa dibaca : CRUD MySQL dengan ReactJS - II [ Front - End ]

CRUD MySQL dengan ReactJS - II [ Front - End ]



Berikut adalah cara membuat CRUD dengan MySql pada React  pada Front-End :

untuk membuat Font-End dengan React, tentunya sudah harus terinstall Node.js yang didalamnya ada npm atau yarm, dimana yang digunakan ada npm pada artikel ini

untuk cara install Node.js bisa dibaca sesuai dengan OS yang digunakan pada link bawah ini : 
Setelah Node.js sudah diinstall dan berjalan maka selanjutnya akan membuat project React sebagai berikut :

1. Buat project, lalu buka new terminal, masuk pada folder fullproject,  kemudian ketik perintah :

npx create-react-app frontend

maka akan terdapat folder backend dan fontend didalam folder fullproject


Pada terminal, lalukan langkah dibawah  :

Setelah itu masuk ke dalam folder frontend, ketikan perintah  :

cd frontend

Kemudian install react-router-dom, axios, dan bulma dengan perintah :

npm install react-router-dom axios bulma

Setelah instalasi selesai, ketikan perintah berikut untuk menjalankan project:

npm start

Lalu  buka browser ketikan http : //localhost:3000



2. Components

Buat folder “components” di dalam folder “frontend/src”. dan buat file didalam folder components terdiri dari :
 “ProductList.js”
“AddProduct.js” 
“EditProduct.js” 

sehingga terlihat gambar berikut:


Kemudian buka file  dan isikan sintak masing-masing file tersebut :

“AddProduct.js”

import { useState } from 'react'
import axios from "axios";
import { useHistory } from 'react-router-dom';
 
const AddProduct = () => {
    const [nama, setNama] = useState('');
    const [harga, setHarga] = useState('');
    const history = useHistory();
 
    const saveProduct = async (e) => {
        e.preventDefault();
        await axios.post('http://localhost:5000/products',{
            nama: nama,
            harga: harga
        });
        history.push("/");
    }
 
    return (
        <div>
            <form onSubmit={ saveProduct }>
                <div className="field">
                    <label className="label">Nama</label>
                    <input 
                        className="input"
                        type="text"
                        placeholder="Nama"
                        value={ nama }
                        onChange={ (e) => setNama(e.target.value) }
                    />
                </div>
 
                <div className="field">
                    <label className="label">Harga</label>
                    <input 
                        className="input"
                        type="text"
                        placeholder="Harga"
                        value={ harga }
                        onChange={ (e) => setHarga(e.target.value) }
                    />
                </div>
 
                <div className="field">
                    <button className="button is-primary">Save</button>
                </div>
            </form>
        </div>
    )
}
 
export default AddProduct



 “EditProduct.js”

/* eslint-disable react-hooks/exhaustive-deps */
import { useState, useEffect } from 'react'
import axios from "axios";
import { useHistory, useParams } from 'react-router-dom';
 
const EditProduct = () => {
    const [nama, setNama] = useState('');
    const [harga, setHarga] = useState('');
    const history = useHistory();
    const { id } = useParams();
 
    const updateProduct = async (e) => {
        e.preventDefault();
        await axios.patch(`http://localhost:5000/products/${id}`,{
            nama: nama,
            harga: harga
        });
        history.push("/");
    }
 
    useEffect(() => {
        getProductById();
    }, []);
 
    const getProductById = async () => {
        const response = await axios.get(`http://localhost:5000/products/${id}`);
        setNama(response.data.nama);
        setHarga(response.data.harga);
    }
 
    return (
        <div>
            <form onSubmit={ updateProduct }>
                <div className="field">
                    <label className="label">Nama</label>
                    <input 
                        className="input"
                        type="text"
                        placeholder="Nama"
                        value={ nama }
                        onChange={ (e) => setNama(e.target.value) }
                    />
                </div>
 
                <div className="field">
                    <label className="label">Harga</label>
                    <input 
                        className="input"
                        type="text"
                        placeholder="Harga"
                        value={ harga }
                        onChange={ (e) => setHarga(e.target.value) }
                    />
                </div>
 
                <div className="field">
                    <button className="button is-primary">Update</button>
                </div>
            </form>
        </div>
    )
}
 
export default EditProduct



“ProductList.js” 

import { useState, useEffect } from 'react'
import axios from "axios";
import { Link } from "react-router-dom";
 
const ProductList = () => {
    const [products, setProduct] = useState([]);
 
    useEffect(() => {
        getProducts();
    }, []);
 
    const getProducts = async () => {
        const response = await axios.get('http://localhost:5000/products');
        setProduct(response.data);
    }
 
    const deleteProduct = async (id) => {
        await axios.delete(`http://localhost:5000/products/${id}`);
        getProducts();
    }
 
    return (
        <div>
            <Link to="/add" className="button is-primary mt-2">Add New</Link>
            <table className="table is-striped is-fullwidth">
                <thead>
                    <tr>
                        <th>No</th>
                        <th>Nama</th>
                        <th>Harga</th>
                        <th>Actions</th>
                    </tr>
                </thead>
                <tbody>
                    { products.map((product, index) => (
                        <tr key={ product.id }>
                            <td>{ index + 1 }</td>
                            <td>{ product.nama }</td>
                            <td>{ product.harga }</td>
                            <td>
                                <Link to={`/edit/${product.id}`} className="button is-small is-info">Edit</Link>
                                <button onClick={ () => deleteProduct(product.id) } className="button is-small is-danger">Delete</button>
                            </td>
                        </tr>
                    )) }
                     
                </tbody>
            </table>
        </div>
    )
}
 
export default ProductList


Catatan :

pada artikel ini merupakan lanjutan dari pembuatan Back-End, yang bisa dibaca : CRUD MySQL dengan ReactJS - I [ Back - End ] dan  untuk lanjutan pembuatan Front-End, yang bisa dibaca : CRUD MySQL dengan ReactJS - III [ Finish ]

CRUD MySQL dengan ReactJS - I [ Back - End ]



Berikut adalah cara membuat CRUD dengan MySql pada React  pada Back-End:

1. Menggunakan Tools Visual Code, jika belum terpasang maka download dan install 

2. Buat folder untuk project ini : fullproject dan subdirektori dengan nama backend

Kemudian buka folder fullproject dengan menggunakan Visual Code, setelah itu  buka terminal dimenu bar terminal, lalu new terminal. Pada terminal ketikan cd backend untuk masuk ke dalam direktori backend.

pada terminal :

membuat file “package.json” dengan ketikan perintah :

npm init -y

Kemudian  install express, mysql2, sequelize dan cors :

npm install express mysql2 sequelize cors

Selanjutnya install nodemon sebagai development dependensi :

npm install --save-dev nodemon

Lalu buka dan tambahkan kode dibawah pada file “package.json”:

{
  "name": "backend",
  "version": "1.0.0",
  "description": "",
  "type": "module",
  "main": "index.js",
  "scripts": {
    "test": "echo "Error: no test specified" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "cors": "^2.8.5",
    "express": "^4.17.1",
    "mysql2": "^2.3.0",
    "sequelize": "^6.6.5"
  },
  "devDependencies": {
    "nodemon": "^2.0.12"
  }
}

Tujuan pada proses diatas adalah agar dapat menggunakan ES6 Module Syntax untuk export dan import module.


3. Buat database & Table untuk digunakan, bisa baca Membuat Database di XAMPP jika belum paham pembuatan database dan table sdengan XAMPP

Buat database dengan nama : dbdata
Buat table dengan nama products, yang terdiri dari fields  :

Field Tipe Length   Keterangan
id int 11 Auto_Increment     
nama varchar     200
hargadouble

createdAt Date

updatedAt       Date


4.  Membuat Struktur Project
Biar project terstruktur rapi,  terapkan pola MVC ( Model-View-Controllers ) . 
Buat folder  di dalam folder “backend” :

“config”, 
“controllers”, 
“models”, 
“routes” 

Kemudian buat file :

“database.js” di dalam folder “config”, 
“Products.js” di dalam folder “controllers”, 
“productModel.js” di dalam folder “models”, 
“index.js” di dalam folder “routes”, 
“index.js” di dalam folder “backend”.

Untuk lebih jelas dapat dilihat gambar dibawah ini :



5. Connect Database  

Isikan sintak pada “database.js” yang terdapat pada folder “config”:

import { Sequelize } from "sequelize";
const db = new Sequelize('dbdata', 'root', '', {  host: "localhost",  dialect: "mysql"}
);
export default db;


6.  Buat Model2

Isikan sintak pada file model “productModel.js” yang terdapat pada folder “models

import { Sequelize } from "sequelize";
import db from "../config/database.js";
 
const { DataTypes } = Sequelize;
 
const Product = db.define('products',{
    title:{
        type: DataTypes.STRING
    },
    price:{
        type: DataTypes.DOUBLE
    }
},{
    freezeTableName: true
});
 
export default Product;


7.  Buat Controllers

Isikan sintak pada file controller “Products.js” yang terdapat pada folder “controllers

import Product from "../models/productModel.js";
 
export const getAllProducts = async (req, res) => {
    try {
        const products = await Product.findAll();
        res.json(products);
    } catch (error) {
        res.json({ message: error.message });
    }  
}
 
export const getProductById = async (req, res) => {
    try {
        const product = await Product.findAll({
            where: {
                id: req.params.id
            }
        });
        res.json(product[0]);
    } catch (error) {
        res.json({ message: error.message });
    }  
}
 
export const createProduct = async (req, res) => {
    try {
        await Product.create(req.body);
        res.json({
            "message": "Product Created"
        });
    } catch (error) {
        res.json({ message: error.message });
    }  
}
 
export const updateProduct = async (req, res) => {
    try {
        await Product.update(req.body, {
            where: {
                id: req.params.id
            }
        });
        res.json({
            "message": "Product Updated"
        });
    } catch (error) {
        res.json({ message: error.message });
    }  
}
 
export const deleteProduct = async (req, res) => {
    try {
        await Product.destroy({
            where: {
                id: req.params.id
            }
        });
        res.json({
            "message": "Product Deleted"
        });
    } catch (error) {
        res.json({ message: error.message });
    }  
}


8. Routes

Isikan sintak pada file “index.js” yang terdapat pada folder “routes

import express from "express";
 
import { 
    getAllProducts,
    createProduct,
    getProductById,
    updateProduct,
    deleteProduct
} from "../controllers/Products.js";
 
const router = express.Router();
 
router.get('/', getAllProducts);
router.get('/:id', getProductById);
router.post('/', createProduct);
router.patch('/:id', updateProduct);
router.delete('/:id', deleteProduct);
 
export default router;


9.  Entry Point

Isikan sintak pada file “index.js” yang terdapat pada folder “backend

import express from "express";
import db from "./config/database.js";
import productRoutes from "./routes/index.js";
import cors from "cors";
 
const app = express();
 
try {
    await db.authenticate();
    console.log('Database connected success ');
} catch (error) {
    console.error('Connection error:', error);
}
 
app.use(cors());
app.use(express.json());
app.use('/products', productRoutes);
 
app.listen(5000, () => console.log('Server running at port 5000'));


Setelah semua telah dilakukan, uji project apakah berjalan dengan baik dengan perintah pada terminal :

nodemon index

Jika sukses maka akan ditampilkan layout seperti dibawah :



Catatan :

untuk lanjutan pembuatan Front-End, yang bisa dibaca : CRUD MySQL dengan ReactJS - II [ Front - End ]

Memunculkan Simbol & Emoji Pada OS Mac

  Memunculkan Simbol & Emoji  1. Buka aplikasi Pages / Notes pada Macbook. 2. Klik pada Menubar Edit --> Pilih Emoji and Symbols a...