Basic Web - Modul 2 - Merged
Basic Web - Modul 2 - Merged
MySkill.id
Raihan Nismara
1. Install Laravel Project
Pertama, buka Terminal dan jalankan perintah berikut untuk membuat proyek Laravel baru:
atau, jika Anda telah menginstal Penginstal Laravel sebagai ketergantungan komposer global:
laravel new crud-react-laravel
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=<DATABASE NAME>
DB_USERNAME=<DATABASE USERNAME>
DB_PASSWORD=<DATABASE PASSWORD>
-mcr argumen ini akan membuat Model, Migrasi, dan Pengontrol dalam Perintah Tunggal.
Sekarang, Buka file migrasi produk dari database/migrasi dan ganti kode di fungsi up() :
Sekarang, Buka model Category.php dari app / Models dan perbarui kode ke Model Product.php :
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use HasFactory;
?>
Selanjutnya, Buka ProductController.php dan tambahkan kode pada fungsi indeks, simpan, tampilkan, perbarui,
dan hapus sebagai berikut:
<?php
namespace App\Http\Controllers;
use App\Models\Product;
use Illuminate\Http\Request;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Storage;
use Carbon\Carbon;
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$request->validate([
'title'=>'required',
'description'=>'required',
'image'=>'required|image'
]);
try{
$imageName = Str::random().'.'.$request->image->getClientOriginalExtension();
Storage::disk('public')->putFileAs('product/image', $request->image,$imageName
Product::create($request->post()+['image'=>$imageName]);
return response()->json([
'message'=>'Product Created Successfully!!'
]);
}catch(\Exception $e){
\Log::error($e->getMessage());
return response()->json([
'message'=>'Something goes wrong while creating a product!!'
],500);
}
}
/**
* Display the specified resource.
*
* @param \App\Models\Product $product
* @return \Illuminate\Http\Response
*/
public function show(Product $product)
{
return response()->json([
'product'=>$product
]);
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param \App\Models\Product $product
* @return \Illuminate\Http\Response
*/
public function update(Request $request, Product $product)
{
$request->validate([
'title'=>'required',
'description'=>'required',
'image'=>'nullable'
]);
try{
$product->fill($request->post())->update();
if($request->hasFile('image')){
$imageName = Str::random().'.'.$request->image->getClientOriginalExtension
Storage::disk('public')->putFileAs('product/image', $request->image,$image
$product->image = $imageName;
$product->save();
}
return response()->json([
'message'=>'Product Updated Successfully!!'
]);
}catch(\Exception $e){
\Log::error($e->getMessage());
return response()->json([
'message'=>'Something goes wrong while updating a product!!'
],500);
}
}
/**
* Remove the specified resource from storage.
*
* @param \App\Models\Product $product
* @return \Illuminate\Http\Response
*/
public function destroy(Product $product)
{
try {
if($product->image){
$exists = Storage::disk('public')->exists("product/image/{$product->image}
if($exists){
Storage::disk('public')->delete("product/image/{$product->image}");
}
}
$product->delete();
return response()->json([
'message'=>'Product Deleted Successfully!!'
]);
} catch (\Exception $e) {
\Log::error($e->getMessage());
return response()->json([
'message'=>'Something goes wrong while deleting a product!!'
]);
}
}
}
use App\Http\Controllers\ProductController;
Route::resource('products',ProductController::class);
Sebelum memulai aplikasi, Anda perlu menjalankan perintah ini untuk mengakses semua gambar yang diunggah,
abaikan perintah ini jika Anda tidak mengunggah di disk publik.
Disk ini public ditujukan untuk file yang akan dapat diakses publik. Secara default, public disk menggunakan
driver lokal dan menyimpan file-file ini dalam format storage/app/public . Agar dapat diakses dari web, Anda
harus membuat tautan simbolik dari public/storage ke storage/app/public .
Mulai aplikasi dengan menjalankannya php artisan serve dan Anda akan melihat bahwa API Anda tersedia
untuk digunakan dengan Tukang Pos atau klien REST lain yang Anda inginkan.
Di folder terpisah, jalankan perintah berikut untuk menginstal create-react-app dan membuat aplikasi react
bernama manajer pengeluaran, cd ke dalam folder, lalu instal Axios (klien HTTP untuk mengirim
XMLHttpRequests), react-bootstrap dan bootstrap sebagai serta sweetalert2 yang telah memberi kami kotak
peringatan yang tampak cantik.
Setelah instalasi selesai, buka src/app.js dan impor file inti bootstrap berikut ke bagian atas kode:
import 'bootstrap/dist/css/bootstrap.css';
Langkah selanjutnya adalah membuat komponen yang kita butuhkan dalam aplikasi kita, buka src folder Anda
dan buat folder baru di dalamnya bernama components , di components folder tersebut buat folder lain
bernama product , buat file berikut di product folder:
create.component.js
edit.component.js
list.component.js
formData.append('title', title)
formData.append('description', description)
formData.append('image', image)
return (
<div className="container">
<div className="row justify-content-center">
<div className="col-12 col-sm-12 col-md-6">
<div className="card">
<div className="card-body">
<h4 className="card-title">Create Product</h4>
<hr />
<div className="form-wrapper">
{
Object.keys(validationError).length > 0 && (
<div className="row">
<div className="col-12">
<div className="alert alert-danger">
<ul className="mb-0">
{
Object.entries(validationError).map(([key, value])=>(
<li key={key}>{value}</li>
))
}
</ul>
</div>
</div>
</div>
)
}
<Form onSubmit={createProduct}>
<Row>
<Col>
<Form.Group controlId="Name">
<Form.Label>Title</Form.Label>
<Form.Control type="text" value={title} onChange={(event)=>{
setTitle(event.target.value)
}}/>
</Form.Group>
</Col>
</Row>
<Row className="my-3">
<Col>
<Form.Group controlId="Description">
<Form.Label>Description</Form.Label>
<Form.Control as="textarea" rows={3} value={description} onCha
setDescription(event.target.value)
}}/>
</Form.Group>
</Col>
</Row>
<Row>
<Col>
<Form.Group controlId="Image" className="mb-3">
<Form.Label>Image</Form.Label>
<Form.Control type="file" onChange={changeHandler} />
</Form.Group>
</Col>
</Row>
<Button variant="primary" className="mt-2" size="lg" block="block" type=
Save
</Button>
</Form>
</div>
</div>
</div>
</div>
</div>
</div>
)
}
const { id } = useParams()
const [title, setTitle] = useState("")
const [description, setDescription] = useState("")
const [image, setImage] = useState(null)
const [validationError,setValidationError] = useState({})
useEffect(()=>{
fetchProduct()
},[])
return (
<div className="container">
<div className="row justify-content-center">
<div className="col-12 col-sm-12 col-md-6">
<div className="card">
<div className="card-body">
<h4 className="card-title">Update Product</h4>
<hr />
<div className="form-wrapper">
{
Object.keys(validationError).length > 0 && (
<div className="row">
<div className="col-12">
<div className="alert alert-danger">
<ul className="mb-0">
{
Object.entries(validationError).map(([key, value])=>(
<li key={key}>{value}</li>
))
}
</ul>
</div>
</div>
</div>
)
}
<Form onSubmit={updateProduct}>
<Row>
<Col>
<Form.Group controlId="Name">
<Form.Label>Title</Form.Label>
<Form.Control type="text" value={title} onChange={(event)=>{
setTitle(event.target.value)
}}/>
</Form.Group>
</Col>
</Row>
<Row className="my-3">
<Col>
<Form.Group controlId="Description">
<Form.Label>Description</Form.Label>
<Form.Control as="textarea" rows={3} value={description} onCha
setDescription(event.target.value)
}}/>
</Form.Group>
</Col>
</Row>
<Row>
<Col>
<Form.Group controlId="Image" className="mb-3">
<Form.Label>Image</Form.Label>
<Form.Control type="file" onChange={changeHandler} />
</Form.Group>
</Col>
</Row>
<Button variant="primary" className="mt-2" size="lg" block="block" type=
Update
</Button>
</Form>
</div>
</div>
</div>
</div>
</div>
</div>
)
}
Terakhir, buka list.component.js file tersebut dan tambahkan yang berikut ini:
useEffect(()=>{
fetchProducts()
},[])
if(!isConfirm){
return;
}
await axios.delete(`http://localhost:8000/api/products/${id}`).then(({data})=>{
Swal.fire({
icon:"success",
text:data.message
})
fetchProducts()
}).catch(({response:{data}})=>{
Swal.fire({
text:data.message,
icon:"error"
})
})
}
return (
<div className="container">
<div className="row">
<div className='col-12'>
<Link className='btn btn-primary mb-2 float-end' to={"/product/create"}>
Create Product
</Link>
</div>
<div className="col-12">
<div className="card card-body">
<div className="table-responsive">
<table className="table table-bordered mb-0 text-center">
<thead>
<tr>
<th>Title</th>
<th>Description</th>
<th>Image</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
{
products.length > 0 && (
products.map((row, key)=>(
<tr key={key}>
<td>{row.title}</td>
<td>{row.description}</td>
<td>
<img width="50px" src={`http://localho
</td>
<td>
<Link to={`/product/edit/${row.id}`} c
Edit
</Link>
<Button variant="danger" onClick={()=>
Delete
</Button>
</td>
</tr>
))
)
}
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
)
}
function App() {
return (<Router>
<Navbar bg="primary">
<Container>
<Link to={"/"} className="navbar-brand text-white">
Basic Crud App
</Link>
</Container>
</Navbar>
<Container className="mt-5">
<Row>
<Col md={12}>
<Routes>
<Route path="/product/create" element={<CreateProduct />} />
<Route path="/product/edit/:id" element={<EditProduct />} />
<Route exact path='/' element={<ProductList />} />
</Routes>
</Col>
</Row>
</Container>
</Router>);
}
Sebaiknya ikuti aplikasi demo sederhana yang dapat ditemukan di repo Backend Github dan repo Frontend
Github .
Jika Anda ingin mengelola VPS/VM Server Anda tanpa menyentuh baris perintah, buka tautan ini .
ServerAvatar memungkinkan Anda dengan cepat mengatur situs WordPress atau Custom PHP di VPS / VM
dalam hitungan menit. Anda dapat menghosting beberapa situs web dalam satu VPS/VM, mengonfigurasi
sertifikat SSL, dan memantau kesehatan server Anda tanpa harus menyentuh antarmuka baris perintah .
Jika Anda memiliki pertanyaan atau keraguan tentang topik ini, jangan ragu untuk menghubungi kami . Kami
akan mencoba menghubungi Anda.
Laravel MySQL Basis data skrip java tali sepatu Mentah JSON Nodejs
Reaksi reaksi
Sebelumnya Berikutnya
Cara mengelola dan menggunakan… Cara Mereset Kata Sandi Root MySQ…