Investasi adalah Langkah Penting untuk Mencapai Kebebasan Finansial

 

Pengenalan:
Kebebasan finansial adalah impian bagi banyak orang. Mampu hidup tanpa harus khawatir tentang uang adalah tujuan yang sangat diinginkan oleh banyak orang di seluruh dunia. Namun, untuk mencapai kebebasan finansial, diperlukan langkah-langkah yang tepat dan salah satunya adalah melalui investasi. Dalam artikel ini, kita akan membahas mengapa investasi adalah langkah penting untuk mencapai kebebasan finansial.

I. Pengertian Investasi
Sebelum kita membahas mengapa investasi penting, penting untuk memahami apa itu investasi. Investasi adalah tindakan membeli aset atau instrumen keuangan dengan harapan mendapatkan keuntungan di masa depan. Investasi bisa berupa saham, obligasi, properti, atau bisnis. Dalam investasi, ada risiko yang harus dihadapi, namun juga ada potensi keuntungan yang besar.

II. Mengapa Investasi Penting untuk Mencapai Kebebasan Finansial
1. Meningkatkan Pendapatan Pasif
Salah satu alasan mengapa investasi penting adalah karena dapat meningkatkan pendapatan pasif. Pendapatan pasif adalah pendapatan yang diperoleh tanpa harus bekerja secara aktif. Melalui investasi, Anda dapat memanfaatkan uang Anda untuk bekerja untuk Anda. Misalnya, dengan berinvestasi di properti, Anda dapat menerima pendapatan dari sewa tanpa harus melakukan banyak pekerjaan.

2. Melawan Inflasi
Inflasi adalah peningkatan harga barang dan jasa dari waktu ke waktu. Jika uang Anda hanya disimpan di bank atau dalam bentuk tunai, nilainya akan tergerus oleh inflasi. Namun, dengan berinvestasi, Anda dapat menghasilkan keuntungan yang melebihi tingkat inflasi, sehingga melindungi nilai kekayaan Anda dari inflasi.

3. Diversifikasi Portofolio
Investasi juga penting untuk mencapai kebebasan finansial karena memungkinkan Anda untuk mendiversifikasi portofolio keuangan Anda. Diversifikasi adalah strategi untuk mengurangi risiko dengan menempatkan uang Anda dalam berbagai jenis investasi. Dengan memiliki portofolio yang terdiversifikasi, Anda dapat mengurangi risiko kehilangan seluruh investasi Anda jika salah satu investasi mengalami kerugian.

4. Mencapai Tujuan Keuangan
Investasi adalah alat yang kuat untuk mencapai tujuan keuangan Anda. Apakah itu membeli rumah impian, pendidikan anak-anak, atau pensiun yang nyaman, investasi dapat membantu Anda mencapai tujuan keuangan jangka panjang Anda. Dengan memulai investasi lebih awal, Anda memiliki lebih banyak waktu untuk menghasilkan keuntungan dan mencapai tujuan keuangan Anda.

5. Memperluas Pengetahuan Keuangan
Berinvestasi juga memberikan kesempatan untuk memperluas pengetahuan keuangan Anda. Dalam proses berinvestasi, Anda akan belajar tentang pasar keuangan, analisis investasi, dan strategi investasi yang berbeda. Pengetahuan ini dapat membantu Anda membuat keputusan keuangan yang lebih baik dan mengelola keuangan Anda dengan lebih efektif.

III. Kesimpulan
Investasi adalah langkah penting untuk mencapai kebebasan finansial. Melalui investasi, Anda dapat meningkatkan pendapatan pasif, melawan inflasi, mendiversifikasi portofolio, mencapai tujuan keuangan, dan memperluas pengetahuan keuangan Anda. Namun, penting juga untuk diingat bahwa investasi melibatkan risiko, dan penting untuk melakukan riset dan konsultasi sebelum melakukan investasi. Dengan langkah yang tepat, investasi dapat menjadi alat yang kuat untuk mencapai kebebasan finansial yang Anda impikan.

Pentingnya Penulisan Artikel di Era Digital Saat Ini

Di era digital saat ini, penulisan artikel memainkan peran penting dalam komunikasi online. Dengan pesatnya perkembangan teknologi informasi dan komunikasi, individu memiliki akses ke berbagai sarana komunikasi, seperti smartphone dan internet [1]. Artikel berfungsi sebagai alat yang ampuh untuk menyampaikan informasi dan ide kepada khalayak luas. Mereka dapat dengan mudah dibagikan dan diakses melalui berbagai platform online, menjadikannya sarana komunikasi yang efektif [2]. Selain itu, artikel dapat digunakan untuk memberikan wawasan dan perspektif yang berharga tentang berbagai topik, menjadikannya komponen penting dari wacana online. 

Penulisan artikel juga berkontribusi dalam membangun merek. Dengan membuat dan mengunggah artikel yang terkait dengan bidang atau industrinya, individu dan bisnis dapat meningkatkan profil merek mereka dan menjadikan diri mereka sebagai pemimpin pemikiran di bidangnya masing-masing [3]. Citra merek yang kuat sangat penting untuk mendapatkan kepercayaan publik dan membangun kredibilitas [4]. Artikel juga dapat digunakan untuk menunjukkan keahlian dan pengalaman, membantu membedakan diri dari pesaing [5]. Dengan demikian, penulisan artikel adalah cara yang efektif untuk membangun merek dan memantapkan diri sebagai pemimpin dalam industri atau bidang tertentu. 

Terakhir, penulisan artikel memberikan banyak peluang pertumbuhan pribadi dan profesional. Menulis artikel dapat membantu individu mengembangkan keterampilan menulis, kemampuan penelitian, dan keterampilan berpikir kritis [6]. Ini juga dapat menyebabkan peningkatan visibilitas dan eksposur, yang dapat mengarah pada peluang dan koneksi baru [7]. Selain itu, menulis artikel dapat membantu individu tetap up-to-date dengan tren dan perkembangan terbaru di bidangnya, yang mengarah pada pembelajaran dan pertumbuhan yang berkelanjutan [8]. Secara keseluruhan, penulisan artikel adalah alat penting untuk pengembangan pribadi dan profesional di era digital saat ini.

Manfaat dan tantangan menggunakan AI untuk pembuatan artikel

Penggunaan teknologi AI dalam penulisan artikel menjadi semakin populer karena potensi manfaatnya. Salah satu keuntungan utama menggunakan penulisan artikel berbantuan AI adalah peningkatan efisiensi dan produktivitas yang diberikannya. Dengan bantuan alat AI, penulis dapat menghasilkan artikel dalam waktu yang lebih singkat, memungkinkan mereka untuk fokus pada tugas penting lainnya [1]. AI juga dapat mengotomatiskan tugas yang berulang, seperti penelitian dan pengecekan fakta, membebaskan lebih banyak waktu bagi penulis untuk fokus pada aspek kreatif penulisan [2]. Dengan demikian, memasukkan AI ke dalam proses penulisan artikel dapat meningkatkan produktivitas dan efisiensi, yang pada akhirnya menghasilkan lebih banyak artikel yang diproduksi dalam waktu yang lebih singkat [3].

Manfaat lain menggunakan AI dalam penulisan artikel adalah konsistensi yang diberikannya dalam hal gaya dan nada penulisan. AI dapat membantu mempertahankan nada dan gaya yang konsisten di seluruh artikel, memastikannya memenuhi standar yang diinginkan [4]. Ini dapat sangat berguna untuk bisnis yang membutuhkan suara merek tertentu atau untuk penulis yang perlu mempertahankan nada yang konsisten di banyak artikel. Selain itu, AI dapat membantu mengidentifikasi dan memperbaiki kesalahan dalam penulisan, memastikan produk akhir berkualitas tinggi [2]. Dengan demikian, memasukkan AI ke dalam proses penulisan artikel dapat menghasilkan konten yang lebih konsisten dan bebas kesalahan.

Terlepas dari manfaat penggunaan AI dalam penulisan artikel, ada juga beberapa tantangan yang harus diperhatikan. Salah satu tantangan utamanya adalah potensi kurangnya kreativitas dan orisinalitas dalam konten yang dihasilkan oleh AI [5]. Meskipun AI dapat membantu penelitian dan pemeriksaan fakta, AI mungkin tidak dapat menghasilkan ide atau perspektif yang benar-benar unik. Selain itu, ada risiko ketergantungan yang berlebihan pada AI, yang dapat menyebabkan hilangnya sentuhan manusia pada konten yang dihasilkan [6]. Oleh karena itu, penting untuk mencapai keseimbangan antara penggunaan AI dan input manusia dalam penulisan artikel untuk memastikan hasil terbaik.

Pengalaman Menggunakan Jenius #ceritajenius

Hello Guys, sudah lama admin tidak menulis artikel di blog ini, kebetulan kali ini lagi ada kompetisi lomba menulis blog yang bertajuk Co.Create Blog Competion: #ceritajenius

ya kali ini kita akan membahas tentang aplikasi jenius, sudah pada tau kan jenius? jenius adalah aplikasi perbankan digital dari bank BTPN, awalnya saya mencoba jenius karena mengincar bonus awal pendaftaran, tetapi setelah di coba lama kelamaan saya malah nyaman dengan aplikasi ini

dengan jenius segala transaksi jadi mudah, dan yang paling keren tidak ada biaya admin dan tidak ada saldo yg di tahan tidak seperti bank lain, juga kita akan mendapatkan total hingga 25 kali transfer bebas biaya ke semua bank, dan 25 kali gratis pengambilan uang di ATM bank lain yang tergabung di jaringan ATM Bank Bersama, cyrus, maestro, Alto dan prima debit jika saldo rata-rata bulanan kita diatas 10 juta

segala macam transaksi mudah dilakukan dengan jenius di dalam dan di luar negri, mau menabung? bisa, ada fitur saveIt dan dreamSaver. enaknya menabung dengan SaveIt di jenius bisa dapat bunga 4% p.a. kalo mau menyimpan deposito ada fitur maxi saver dengan tenor minimal 3 bulan dan bunga mulai dari 6,5% p.a.

mau minjam uang? bisa, ada flexi cash bisa melakukan pinjaman hingga 25juta dengan bunga rendah sekitar 2% per bulan

mau topup e-wallet? bisa, ada menu khusus buat topup e-wallet di aplikasi jenius sekali klik, bisa topup gopay, ovo, dana, linkaja

mau jalan-jalan ke luar negri jadi gampang berkat fitur ubah mata uang di jenius, bisa merubah mata uang dari rupiah ke US$ dolar, euro, JP¥, HKY, SGD dan masih banyak lagi, dan dengan kartu visa debit yang dilengkapi dengan fitu visa contactles kita bisa menggunakan kartu debit jenius kita langsung untuk transaksi di luar negri, seperti transaksi di merchant, naik metro tinggal tempel saja, tidak usah repot beli kartu lagi

Sekarang ada fitur baru jenius QR transaksi di merchant tinggal scan langsung di aplikasi jenius, fitur moneytori untuk mengetahui history pengluaran dan pemasukan kita, fitur in&out melihat saldo keluar masuk

dengan XCard bisa memiliki lebih dari satu kartu debit jenius dalam satu rekening, kartu utama berwarna orange, kita bisa meminta kartu tambahan misalnya kartu debit GPN untuk transaksi di dalam negri, kita bisa bebas meminta kartu tambahan XCard baik yg berlogo VISA maupun GPN, jadi kita bisa memisahkan kartu misalnya yg satu untuk belanja, yg satu untuk traveling dll.

MCard kartu debit virtual sangat berguna buat transaksi online, seperti layaknya VCN, MCard bisa digunakan untuk berbagai transaksi online agar lebih aman karena terpisah dengan kartu utama, MCard bisa digunakan untuk bayar akun google play developer, bisa buat isi paypal, bisa buat bayar facebook ads dll.

debit online dengan visa debit, dengan kartu berlogo VISA kita jadi mudah buat debit online, jadi saat melakukan transaksi kita tidak usah membuka dulu aplikasi jenius tinggal sambungkan dengan aplikasi toko online atau dompet digital. misalnya kita mau topup dana dengan fitur debit online akan langsung memotong saldo jenius kita tanpa membuka aplikasi jenius.

$Cashtag memungkinkan nomor rekening kita dengan nama misalnya '$juanas' namarekening diawali dengan tanda $, transfer ke sesama tinggal masukan cashtag, donasi di kitabisa tinggal masukan cashtag

EverYay dapatkan cashback ataupun saldo tambahan dari program EverYay, transfer Hari Senin dari bank lain bebas biaya berupa cashback 6500

dengan segala kemudahan diatas dan gratis biaya admin serta bunga yang lumayan untuk menabung, admin semakin betah menggunakan jenius dari coba-coba jadi pengguna setia

itulah pengalaman admin menggunakan jenius, ingin mencoba? tunggu aplagi download aplikasi jenius sekarang, nikmati pengalaman digital banking yg menyenagkan



Membuat animasi Shape Tween dengan Adobe Flash

Selamat Siang Guys, Kali ini Ane mau share tentang cara membuat animasi shape tween pada adobe flash sebelumnya kita sudah membuat animasi text masking. Animasi Shape Tween adalah animasi berubah bentuk misalnya dari kotak jadi bulat, atau dari tulisan menjadi bentuk partikel kecil-kecil. contohnya seperti di bawah

kemudian buatlah text yang akan dijadikan animasi berubah bentuk

selanjutnya text tersebut dipisahkan dengan cara tekan tombol ctrl + B

kemudian agar text nya bisa berubah bentuk harus di convert menjadi break-apart, klik kanan -> pilih break-apart

kemudian insert keyframe

pada frame terakhir hapus text tadi diganti dengan bentuk yang diinginkan

kemudian pada bagian tengah timeline klik kanan -> pilih shape tween

jadi seperti berikut, kemudian jalankan dengan ctrl+enter


ok, terimakasih telah mengikuti tutorial ini, jika artikel ini bermanfaat silakan di share, jika ada yang kurang jelas silakan ditanyakan di kolom komentar

Membuat Animasi Teks Masking dengan Adobe Flash

Selamat Malam, Kali ini Saya mau sharing pengalaman Saya membuat animasi masking, Waktu itu saya mengikuti LSP Desain Multimedia dan Saya mendapatkan soal membuat animasi masking dan animasi Shape tween, tutorial ini cocok bagi pemula yang baru belajar adobe flash ataupun bagi anda yang sedang ujian seperti Saya.

Tampilan Animasi Teks Masking


Langkah pertama buka Adobe Flash, kemudian pilih new -> actionscript 2.0 >> untuk ukuranya width 550 x height 400 pixel dan framerate 24 fps


jika anda baru menginstall adobe flash dan pertama kali membukanya atur agar tampilanya seperti berikut, caranya klik pada menubar windows -> workspace -> classic

Kemudian Buat Teks yang ingin di animasikan


Selanjutnya duplikat layer dan ganti warna text di layer yang di duplikat, lalu insert keyframe bebas, disini saya insert keyframe pada frame ke 60



kemudian buat lagi layer baru, pindahkan layer baru ke tengah diantara layer1 dan layer duplikat, kemudian di layer baru itu buat objek kotak atau lingkaran dan beri warna


kemudian gerakan dengan cara insert keyframe di frame ke 60 kemudian di frame ke 60 pada layer object lingkaran di saya pada layer2 pindahkan objek lingkaran ke ujung kanan atau ujung text, seperti pada gambar di bawah


kemudian klik kanan antara frame ke satu sampai 60 lalu pilih create classic tween

lalu pada layer paling atas klik kanan pilih mask

Hasil akhirnya seperti di bawah, untuk merubah background pilih warna di stage ada di bagian properties sebelah kanan


Untuk menjalankanya tekan tombol ctrl + enter, untuk publish ke swf pilih file -> publish, untuk merubah ke format gif pilih export -> export movie -> pilih format Animated Gif



Terimakasih telah mengikuti tutorial ini, jika ada yang ingin ditanyakan silakan tulis pada kolom komentar dibawah, jika artikel ini bermanfaat silakan share ke teman anda

Membuat CRUD dengan Laravel 5.8

Hallo Selamat malam, kali ini kita akan belajar Laravel. Ok langsung aja kita install dulu laravelnya kita akan menginstall laravel terbaru versi 5.8 tapi sebelumnya kita harus upgrade dulu PHP kita ke versi 7 karena PHP 5.6 hanya bisa menginstall laravel sampai versi 5.4, setelah menginstall PHP versi 7 selanjutnya kita install composer, anda bisa mendownloadnya di website composer https://getcomposer.org/. Selanjutnya download laravel ke dalam folder project kita dengan perintah:
composer create-project --prefer-dist laravel/laravel laravel58crud
sekarang masuk ke dalam folder project dan buka text editor
cd laravel58crud
code .

#1 Configurasi database


untuk databasenya kita akan menggunakan MySQL. sekarang kita buat databasenya dengan nama laravel58crud kemudian buka file .env dan atur konfigurasi database seperti berikut
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel58crud
DB_USERNAME=root
DB_PASSWORD=root
sekarang project kita sudah terhubung dengan database MySQL Selanjutnya kita akan melakukan migrasi database, buka terminal dan ketikan perintah
php artisan migrate
Kita akan membuat Program penyimpanan Nama buku yang bisa melakukan operasi CRUD create, read, update, delete

#2 Membuat Model dan Migrasi file

php artisan make:model Book -m
akan terbentuk file Book.php dan file migrasi create_books_table.php Sekarang buka folder databse->migrations->create_books_table.php sesuaikan seperti berikut:
public function up()
{
     Schema::create('books', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('book_name');
        $table->string('isbn_no');
        $table->integer('book_price');
        $table->timestamps();
     });
}
sekarang lakukan migrasi dan akan terbentuk table baru di database
php artisan migrate
Sekarang, tambahkan fillable property dalam file Book.php.
// Book.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Book extends Model
{
    protected $fillable = ['book_name', 'isbn_no', 'book_price'];
}

#3 Membuat route dan Controller

buat BookController dengan perintah
php artisan make:controller BookController --resource
didalam routes >> web.php tambahkan kode berikut:
<?php

// BookController.php

Route::get('/', function () {
    return view('welcome');
});

Route::resource('books', 'BookController');
kita bisa melihat list route aplikasi kita dengan perintah
php artisan route:list
Ok Sekarang buka BookController.php kita akan melihat semua fungsi yang di deklarasikan disini
<?php

// BookController.php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class BookController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        //
    }
}

#4 Membuat view

di dalam folder resources >> views buat empat views:
1. create.blade.php
2. edit.blade.php
3. index.blade.php
4. layout.blade.php
kemudian buka file layout.blade.php dan masukan kode berikut:
<!-- layout.blade.php -->

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Laravel 5.8 CRUD Example Tutorial</title>
  <link href="{{ asset('css/app.css') }}" rel="stylesheet" type="text/css" />
</head>
<body>
  <div class="container">
    @yield('content')
  </div>
  <script src="{{ asset('js/app.js') }}" type="text/js"></script>
</body>
</html>
file ini yang akan menjadi template aplikasi kita selanjutnya buka file create.blade.php dan tambahkan kode:
<!-- create.blade.php -->

@extends('layout')

@section('content')
<style>
  .uper {
    margin-top: 40px;
  }
</style>
<div class="card uper">
  <div class="card-header">
    Add Book
  </div>
  <div class="card-body">
    @if ($errors->any())
      <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $error)
              <li>{{ $error }}</li>
            @endforeach
        </ul>
      </div><br />
    @endif
      <form method="post" action="{{ route('books.store') }}">
          <div class="form-group">
              @csrf
              <label for="name">Book Name:</label>
              <input type="text" class="form-control" name="book_name"/>
          </div>
          <div class="form-group">
              <label for="price">Book ISBN Number :</label>
              <input type="text" class="form-control" name="isbn_no"/>
          </div>
          <div class="form-group">
              <label for="quantity">Book Price :</label>
              <input type="text" class="form-control" name="book_price"/>
          </div>
          <button type="submit" class="btn btn-primary">Create Book</button>
      </form>
  </div>
</div>
@endsection
Ok, sekarang kita buka file BookController.php, dan pada bagian create function, kita akan me-return sebuah view ke create.blade.php
// BookController.php

public function create()
{
   return view('create');
}
Simpan perubahan file dan start Laravel development server dengan perintah:
php artisan serve
buka http://localhost:8000/books/create di browser dan kalian akan menemukan halaman berikut:

#5 Menambahkan Validation rules dan menyimpan data

Pada tahapan ini kita akan menggunakan laravel validation Langkah pertama buka BookController.php dan import Book model
// BookController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Book;
sekarang tambahkan kode berikut pada bagian store() di BookController.php
// BookController.php

public function store(Request $request)
{
    $validatedData = $request->validate([
         'book_name' => 'required|max:255',
         'isbn_no' => 'required|alpha_num',
         'book_price' => 'required|numeric',
     ]);
     $book = Book::create($validatedData);

     return redirect('/books')->with('success', 'Book is successfully saved');
}
sekarang kita lihat di browser pada halaman create jika kita submit form kosong akan mengeluarkan pesan error seperti berikut:
Sekarang jika kita mengisi form dengan benar dan kita submit akan tersimpan ke database

#6 Menampilkan data

Sekarang kita akan menulis di function index() di BookController, kita akan me-return view yang akan menampilkan data dari database
// BookController.php

public function index()
{
     $books = Book::all();

     return view('index', compact('books'));
}
Ok, sekarang kita buka file index.blade.php dan masukan kode berikut:
<!-- index.blade.php -->

@extends('layout')

@section('content')
<style>
  .uper {
    margin-top: 40px;
  }
</style>
<div class="uper">
  @if(session()->get('success'))
    <div class="alert alert-success">
      {{ session()->get('success') }}  
    </div><br />
  @endif
  <table class="table table-striped">
    <thead>
        <tr>
          <td>ID</td>
          <td>Book Name</td>
          <td>ISBN Number</td>
          <td>Book Price</td>
          <td colspan="2">Action</td>
        </tr>
    </thead>
    <tbody>
        @foreach($books as $book)
        <tr>
            <td>{{$book->id}}</td>
            <td>{{$book->book_name}}</td>
            <td>{{$book->isbn_no}}</td>
            <td>{{$book->book_price}}</td>
            <td><a href="{{ route('books.edit',$book->id)}}" class="btn btn-primary">Edit</a></td>
            <td>
                <form action="{{ route('books.destroy', $book->id)}}" method="post">
                  @csrf
                  @method('DELETE')
                  <button class="btn btn-danger" type="submit">Delete</button>
                </form>
            </td>
        </tr>
        @endforeach
    </tbody>
  </table>
<div>
@endsection

#7 Membuat Operasi Edit dan Update

Pertama kita rubah kode pada fungsi edit di BookController.php
// BookController.php

public function edit($id)
{
    $book = Book::findOrFail($id);

    return view('edit', compact('book'));
}
lalu buka file edit.blade.php dan tambahkan kode berikut:
<!-- edit.blade.php -->

@extends('layout')

@section('content')
<style>
  .uper {
    margin-top: 40px;
  }
</style>
<div class="card uper">
  <div class="card-header">
    Edit Book
  </div>
  <div class="card-body">
    @if ($errors->any())
      <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $error)
              <li>{{ $error }}</li>
            @endforeach
        </ul>
      </div><br />
    @endif
      <form method="post" action="{{ route('books.update', $book->id) }}">
          <div class="form-group">
              @csrf
              @method('PATCH')
              <label for="name">Book Name:</label>
              <input type="text" class="form-control" name="book_name" value="{{$book->book_name}}"/>
          </div>
          <div class="form-group">
              <label for="price">Book ISBN Number :</label>
              <input type="text" class="form-control" name="isbn_no" value="{{$book->isbn_no}}"/>
          </div>
          <div class="form-group">
              <label for="quantity">Book Price :</label>
              <input type="text" class="form-control" name="book_price" value="{{$book->book_price}}"/>
          </div>
          <button type="submit" class="btn btn-primary">Update Book</button>
      </form>
  </div>
</div>
@endsection
tampilanya seperi berikut:
Sekarang tambahkan kode di bagian update() pada controller
// BookController.php

public function update(Request $request, $id)
    {
        $validatedData = $request->validate([
            'book_name' => 'required|max:255',
            'isbn_no' => 'required|alpha_num',
            'book_price' => 'required|numeric',
        ]);
        Book::whereId($id)->update($validatedData);

        return redirect('/books')->with('success', 'Book is successfully updated');
    }
Sekarang kamu dapat mengedit dan mengupdate data ke dalam databse

#8 Delete Function

Buka Controller dan pada function destroy tambahkan kode
// BookController.php

public function destroy($id)
    {
        $book = Book::findOrFail($id);
        $book->delete();

        return redirect('/books')->with('success', 'Book is successfully deleted');
    }
Sekarang coba hapus buku di browser jika muncul pesan you have successfully delete the book maka fungsi delete berhasil kode lengkap BookController.php akan jadi seperti berikut:
<?php

// BookController.php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Book;

class BookController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $books = Book::all();

        return view('index', compact('books'));
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        return view('create');
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $validatedData = $request->validate([
            'book_name' => 'required|max:255',
            'isbn_no' => 'required|alpha_num',
            'book_price' => 'required|numeric',
        ]);
        $book = Book::create($validatedData);

        return redirect('/books')->with('success', 'Book is successfully saved');
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        $book = Book::findOrFail($id);

        return view('edit', compact('book'));
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        $validatedData = $request->validate([
            'book_name' => 'required|max:255',
            'isbn_no' => 'required|alpha_num',
            'book_price' => 'required|numeric',
        ]);
        Book::whereId($id)->update($validatedData);

        return redirect('/books')->with('success', 'Book is successfully updated');
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        $book = Book::findOrFail($id);
        $book->delete();

        return redirect('/books')->with('success', 'Book is successfully deleted');
    }
}
untuk kode lengkapnya saya telah mengupload ke github
Sekianlah tutorial ini, jika ada yang kurang jelas silakan ditanyakan pada komentar di bawah, jika artikel ini bermanfaat silakan di share, Terimakasih

MEAN Stack CRUD Tutorial

Selamat Malam Kali ini kita akan membuat MEAN (MongoDB Express.js Angular.Js Node.js) CRUD. Kami menggunakan Angular CLI versi terbaru yaitu versi 8, Untuk BackEnd nya kita menggunakan Node.js dan Express.js dan untuk databasenya kita menggunakan MongoDB

#Prequisites 

-telah menginstall Node.js versi terbaru
-telah menginstall MongoDB
 Langkah pertama Buatlah projek baru dengan nama angular8crud menggunakan angular cli dengan perintah
ng new angular8crud
kemudian masuk ke folder projek dan buka dengan code editor disini saya menggunakan visual studio code
cd angular8crud
code .
kemudian tambahkan css pada angular.json disni saya menggunakan bootstrap 4

"styles": [
   "src/styles.css",
   "./node_modules/bootstrap/dist/css/bootstrap.min.css"
 ],
kemudian jalankan Angular server development dengan perintah
ng serve -o 
nanti akan terbuka laman baru di browser dengan alamat http://localhost:4200/ menampilkan halaman awal angular

#1 Deskripsi Projek 

Kita akan membuat Backend dengan Node.js dengan field ProductName, ProductDescription, dan ProductPrice

#2 Menggenerate Angular Component

ng g c product-add --skipTests=true
ng g c product-get --skipTests=true
ng g c product-edit --skipTests=true
sesuaikan kode app-routing.module.ts seperti berikut:
// app-routing.module.ts

import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { ProductAddComponent } from './product-add/product-add.component';
import { ProductEditComponent } from './product-edit/product-edit.component';
import { ProductGetComponent } from './product-get/product-get.component';

const routes: Routes = [
  {
    path: 'product/create',
    component: ProductAddComponent
  },
  {
    path: 'edit/:id',
    component: ProductEditComponent
  },
  {
    path: 'products',
    component: ProductGetComponent
  }
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule { }

#3 Membuat Navigasi 

masukan kode berikut pada app.component.html
<nav class="navbar navbar-expand-sm bg-light">
  <div class="container-fluid">
    <ul class="navbar-nav">
      <li class="nav-item">
        <a routerLink="product/create" class="nav-link" routerLinkActive="active">
          Create Product
        </a>
      </li>
      <li class="nav-item">
        <a routerLink="products" class="nav-link" routerLinkActive="active">
          Products
        </a>
      </li> 
    </ul>
  </div>
</nav>

<div class="container">
  <router-outlet></router-outlet>
</div>

#4 Konfigurasi Angular Router Progres Indicator

kita akan menginstall library ng2-slim-loading-bar dan rxjs untuk menjembatani angular8 dengan package pihak-ketiga
npm install ng2-slim-loading-bar --save
npm install rxjs-compat --save
selanjutnya import SlimLoadingBarModule pada app.module.ts
// app.module.ts

import { SlimLoadingBarModule } from 'ng2-slim-loading-bar';

imports: [
    ...
    SlimLoadingBarModule
],
lalu tambhkan library css pada style.css di folder src
@import "../node_modules/ng2-slim-loading-bar/style.css";

#5Menambahkan Router Event

sekarang tambahkan kode berikut ke app.compnent.ts
// app.component.ts

import { Component } from '@angular/core';
import {SlimLoadingBarService} from 'ng2-slim-loading-bar';
import { NavigationCancel,
        Event,
        NavigationEnd,
        NavigationError,
        NavigationStart,
        Router } from '@angular/router';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'angular8tutorial';
  constructor(private loadingBar: SlimLoadingBarService, private router: Router) {
    this.router.events.subscribe((event: Event) => {
      this.navigationInterceptor(event);
    });
  }
  private navigationInterceptor(event: Event): void {
    if (event instanceof NavigationStart) {
      this.loadingBar.start();
    }
    if (event instanceof NavigationEnd) {
      this.loadingBar.complete();
    }
    if (event instanceof NavigationCancel) {
      this.loadingBar.stop();
    }
    if (event instanceof NavigationError) {
      this.loadingBar.stop();
    }
  }
}
Selanjutnya tambahkan angular ng2-slim-loading-bar ke dalam app.componet.html
<!-- app.component.html -->

<ng2-slim-loading-bar color="blue"></ng2-slim-loading-bar>
<nav class="navbar navbar-expand-sm bg-light">
  <div class="container-fluid">
    <ul class="navbar-nav">
      <li class="nav-item">
        <a routerLink="product/create" class="nav-link" routerLinkActive="active">
          Create Product
        </a>
      </li>
      <li class="nav-item">
        <a routerLink="products" class="nav-link" routerLinkActive="active">
          Products
        </a>
      </li> 
    </ul>
  </div>
</nav>

<div class="container">
  <router-outlet></router-outlet>
</div>

#6 Menambahkan Bootstrap form HTML

tambahkan kode html berikut pada product-add.component.html
<!-- product-add.component.html -->

<div class="card">
  <div class="card-body">
    <form>
      <div class="form-group">
        <label class="col-md-4">Product Name</label>
        <input type="text" class="form-control" />
      </div>
      <div class="form-group">
        <label class="col-md-4">Product Description </label>
        <textarea class="form-control" rows = 7 cols = "5"></textarea>
      </div>
      <div class="form-group">
        <label class="col-md-4">Product Price</label>
        <input type="text" class="form-control" />
      </div>
      <div class="form-group">
        <button type="submit" class="btn btn-primary">Create Product</button>
      </div>
    </form>
  </div>
</div>

#7 Membuat Angular Form Validation

Import ReactiveFormModule ke dalam file app.module.ts
// app.module.ts

import { ReactiveFormsModule } from '@angular/forms';

imports: [
    ...
    ReactiveFormsModule
],
Selanjutnya pada file product-add.component.ts kita akan mengimport FormGroup, FormBuilder, Validators modules dari @angular/forms
// product-add.component.ts

import { Component, OnInit } from '@angular/core';
import { FormGroup,  FormBuilder,  Validators } from '@angular/forms';

@Component({
  selector: 'app-product-add',
  templateUrl: './product-add.component.html',
  styleUrls: ['./product-add.component.css']
})
export class ProductAddComponent implements OnInit {

  angForm: FormGroup;
  constructor(private fb: FormBuilder) {
    this.createForm();
  }

  createForm() {
    this.angForm = this.fb.group({
      ProductName: ['', Validators.required ],
      ProductDescription: ['', Validators.required ],
      ProductPrice: ['', Validators.required ]
    });
  }

  ngOnInit() {
  }

}
sekarang tambahkan kode berikut pada product-add.component.html
<!-- product-add.component.html -->

<div class="card">
  <div class="card-body">
    <form [formGroup]="angForm" novalidate>
      <div class="form-group">
        <label class="col-md-4">Product Name</label>
        <input type="text" class="form-control" 
          formControlName="ProductName" 
          #ProductName />
      </div>
      <div *ngIf="angForm.controls['ProductName'].invalid && (angForm.controls['ProductName'].dirty || angForm.controls['ProductName'].touched)" class="alert alert-danger">
        <div *ngIf="angForm.controls['ProductName'].errors.required">
          Product Name is required.
        </div>
      </div>
      <div class="form-group">
        <label class="col-md-4">Product Description </label>
        <textarea class="form-control" rows = 7 cols = "5"
        formControlName="ProductDescription" 
        #ProductDescription></textarea>
      </div>
      <div *ngIf="angForm.controls['ProductDescription'].invalid && (angForm.controls['ProductDescription'].dirty || angForm.controls['ProductDescription'].touched)" class="alert alert-danger">
        <div *ngIf="angForm.controls['ProductDescription'].errors.required">
          Product Description is required.
        </div>
      </div>
      <div class="form-group">
        <label class="col-md-4">Product Price</label>
        <input type="text" class="form-control" 
          formControlName="ProductPrice" 
          #ProductPrice
        />
      </div>
      <div *ngIf="angForm.controls['ProductPrice'].invalid && (angForm.controls['ProductPrice'].dirty || angForm.controls['ProductPrice'].touched)" class="alert alert-danger">
        <div *ngIf="angForm.controls['ProductPrice'].errors.required">
          Product Price is required.
        </div>
      </div>
      <div class="form-group">
        <button type="submit" class="btn btn-primary"
        [disabled]="angForm.pristine || angForm.invalid" >
          Create Product
        </button>
      </div>
    </form>
  </div>
</div>

#8 Menambahkan dan mengkonfigurasi HttpClientModule

Import HttpClientModule kedalam file app.module.ts
// app.module.ts

import { HttpClientModule } from '@angular/common/http';

imports: [
   ...
    HttpClientModule
 ],

#9 Membuat TypeScript Model file

di dalam folder src -> app, buat file baru dengan nama Product.ts dan masukan kode berikut
// Product.ts

export default class Product {
  ProductName: string;
  ProductDescription: string;
  ProductPrice: number;
}

10 Membuat Angular Service file

fungsi utama service ini untuk menangani AJAX request dari backend server ke frontend
ng g service products --skipTests=true
sesuaikan file product.service.ts sebagai berikut:
// products.service.ts

import { Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root'
})
export class ProductsService {

  constructor() { }
}
sekarang import products.service.ts ke dalam app.module.ts
// app.module.ts

import { ProductsService } from './products.service';

providers: [ ProductsService ],

#11 Submit Form ke dalam Node Server

buat sebuah file products.service.ts dan masukan kode berikut:
// products.service.ts

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';

@Injectable({
  providedIn: 'root'
})
export class ProductsService {

  uri = 'http://localhost:4000/products';

  constructor(private http: HttpClient) { }

  addProduct(ProductName, ProductDescription, ProductPrice) {
    const obj = {
      ProductName,
      ProductDescription,
      ProductPrice
    };
    console.log(obj);
    this.http.post(`${this.uri}/add`, obj)
        .subscribe(res => console.log('Done'));
  }
}
tambahkan Add Product Button di dalam product-add.component.html
<div class="form-group">
        <button (click) = "addProduct(ProductName.value, ProductDescription.value, ProductPrice.value)" type="submit" class="btn btn-primary"
        [disabled]="angForm.pristine || angForm.invalid" >
          Create Product
        </button>
</div>
tambahkan fungsi addProduct dalam file product-add.component.ts
// product-add.component.ts

import { Component, OnInit } from '@angular/core';
import { FormGroup, FormBuilder, Validators } from '@angular/forms';
import { ProductsService } from '../products.service';

@Component({
  selector: 'app-product-add',
  templateUrl: './product-add.component.html',
  styleUrls: ['./product-add.component.css']
})
export class ProductAddComponent implements OnInit {

  angForm: FormGroup;
  constructor(private fb: FormBuilder, private ps: ProductsService) {
    this.createForm();
  }

  createForm() {
    this.angForm = this.fb.group({
      ProductName: ['', Validators.required ],
      ProductDescription: ['', Validators.required ],
      ProductPrice: ['', Validators.required ]
    });
  }

  addProduct(ProductName, ProductDescription, ProductPrice) {
    this.ps.addProduct(ProductName, ProductDescription, ProductPrice);
  }

  ngOnInit() {
  }

}

#12 Membuat Backend API di Node.js

di dalam root folder buat folder baru dengan nama api kemudian buka terminal dan ketikan perintah
npm init -y
kemudian install beberapa modul
npm install express body-parser cors mongoose --save
kemudian kita install nodemon server dan kita modifikasi file server.js agar node.js server bisa restart otomatis
npm install nodemon --save-dev
kemudian di dalam folder api buat file baru dengan nama server.js
// server.js

const express = require('express'),
    path = require('path'),
    bodyParser = require('body-parser'),
    cors = require('cors'),
    mongoose = require('mongoose');

    const app = express();
    let port = process.env.PORT || 4000;

    const server = app.listen(function(){
        console.log('Listening on port ' + port);
    });
kemudian kita akan mengkoneksikan dengan database MongoDB tetapi sebelumnya harus menginstall dulu MongoDB nya dan menstart mongoDB server dengan perintah
mongod

//atau jika di windows
net start mongodb
sekarang kita sudah terhubung ke database, kemudian buat file baru dengan nama DB.js di dalam folder api dan masukan kode berikut:
// DB.js

module.exports = {
  DB: 'mongodb://localhost:27017/ng8crud'
};
kemudian ubah file server.js seperti di bawah agar aplikasi kita terhubung dengan node.js server
// server.js

const express = require('express'),
    path = require('path'),
    bodyParser = require('body-parser'),
    cors = require('cors'),
    mongoose = require('mongoose'),
    config = require('./DB');

    mongoose.Promise = global.Promise;
    mongoose.connect(config.DB, { useNewUrlParser: true }).then(
      () => {console.log('Database is connected') },
      err => { console.log('Can not connect to the database'+ err)}
    );

    const app = express();
    app.use(bodyParser.json());
    app.use(cors());
    const port = process.env.PORT || 4000;

    const server = app.listen(port, function(){
     console.log('Listening on port ' + port);
    });
simpan perubahan di server.js dan buka terminal untuk start server node.js dengan perintah
nodemon server
Sekarang kita mempunyai tiga server yang berjalan
1. Angular Development server untuk frontend
2. Nodemon server untuk Backend
3. MongoDB server untuk database

#13 Membuat Route dan Model file

didalam folder api buat dua buah folder baru dengan nama routes dan models
di dalam models folder buat sebuah file dengan nama Product.js
// Product.js

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

// Define collection and schema for Product
let Product = new Schema({
  ProductName: {
    type: String
  },
  ProductDescription: {
    type: String
  },
  ProductPrice: {
    type: Number
  }
},{
    collection: 'Product'
});

module.exports = mongoose.model('Product', Product);
didalam folder routes buat file baru dengan nama product.route.js dan masukan kode berikut:
// product.route.js

const express = require('express');
const app = express();
const productRoutes = express.Router();

// Require Product model in our routes module
let Product = require('../models/Product');

// Defined store route
productRoutes.route('/add').post(function (req, res) {
  let product = new Product(req.body);
  product.save()
    .then(product => {
      res.status(200).json({'Product': 'Product has been added successfully'});
    })
    .catch(err => {
    res.status(400).send("unable to save to database");
    });
});

// Defined get data(index or listing) route
productRoutes.route('/').get(function (req, res) {
  Product.find(function (err, products){
    if(err){
      console.log(err);
    }
    else {
      res.json(products);
    }
  });
});

// Defined edit route
productRoutes.route('/edit/:id').get(function (req, res) {
  let id = req.params.id;
  Product.findById(id, function (err, product){
      res.json(product);
  });
});

//  Defined update route
productRoutes.route('/update/:id').post(function (req, res) {
  Product.findById(req.params.id, function(err, product) {
    if (!product)
      res.status(404).send("Record not found");
    else {
      product.ProductName = req.body.ProductName;
      product.ProductDescription = req.body.ProductDescription;
      product.ProductPrice = req.body.ProductPrice;

      product.save().then(product => {
          res.json('Update complete');
      })
      .catch(err => {
            res.status(400).send("unable to update the database");
      });
    }
  });
});

// Defined delete | remove | destroy route
productRoutes.route('/delete/:id').get(function (req, res) {
    Product.findByIdAndRemove({_id: req.params.id}, function(err, product){
        if(err) res.json(err);
        else res.json('Successfully removed');
    });
});

module.exports = productRoutes;
tambhkan product route ke server.js
// server.js

const express = require('express'),
    path = require('path'),
    bodyParser = require('body-parser'),
    cors = require('cors'),
    mongoose = require('mongoose'),
    config = require('./DB');

   const productRoute = require('./routes/product.route');
    mongoose.Promise = global.Promise;
    mongoose.connect(config.DB, { useNewUrlParser: true }).then(
      () => {console.log('Database is connected') },
      err => { console.log('Can not connect to the database'+ err)}
    );

    const app = express();
    app.use(bodyParser.json());
    app.use(cors());
    app.use('/products', productRoute);
    const port = process.env.PORT || 4000;

    const server = app.listen(port, function(){
     console.log('Listening on port ' + port);
    });

#14 Menyimpan data ke database MongoDB

Masukan isian form di menu create product lalu submit
kemudian buka mongoDB untuk melihat apakah data sudah tersimpan di database atau belum

#15 Menampilkan data pada Angular FrontEnd

masukan kode berikut pada product-get.component.html:
<!-- product-get.component.html -->

<table class="table table-hover">
  <thead>
  <tr>
      <td>Product Name</td>
      <td>Product Description</td>
      <td>Product Price</td>
      <td colspan="2">Actions</td>
  </tr>
  </thead>

  <tbody>
      <tr *ngFor="let product of products">
          <td>{{ product.ProductName }}</td>
          <td>{{ product.ProductDescription }}</td>
          <td>{{ product.ProductPrice }}</td>
          <td><a [routerLink]="['/edit', product._id]" class="btn btn-primary">Edit</a></td>
          <td><a [routerLink]="" class="btn btn-danger">Delete</a></td>
      </tr>
  </tbody>
</table>
di dalam products.service.ts masukan fungsi getProducts() untuk fetching data dari database ke Aplikasi Angular
// products.service.ts

getProducts() {
    return this
           .http
           .get(`${this.uri}`);
  }
Sekarang kita include products.service.ts file dan Product.ts file kedalam product-get.component.ts
// product-get.component.ts

import { Component, OnInit } from '@angular/core';
import Product from '../Product';
import { ProductsService } from '../products.service';

@Component({
  selector: 'app-product-get',
  templateUrl: './product-get.component.html',
  styleUrls: ['./product-get.component.css']
})
export class ProductGetComponent implements OnInit {

  products: Product[];
  constructor(private ps: ProductsService) { }

  ngOnInit() {
    this.ps
      .getProducts()
      .subscribe((data: Product[]) => {
        this.products = data;
    });
  }

}
cek di browser dengan membuka URL: http://localhost:4200/products

#16 Edit dan Update

tambahkan kode berikut ke dalam file product-edit.component.ts:
// product-edit.component.ts

import { Component, OnInit } from '@angular/core';
import { FormGroup, FormBuilder, Validators } from '@angular/forms';
import { ActivatedRoute, Router } from '@angular/router';
import { ProductsService } from '../products.service';

@Component({
  selector: 'app-product-edit',
  templateUrl: './product-edit.component.html',
  styleUrls: ['./product-edit.component.css']
})
export class ProductEditComponent implements OnInit {

  angForm: FormGroup;
  product: any = {};

  constructor(private route: ActivatedRoute, private router: Router, private ps: ProductsService, private fb: FormBuilder) {
      this.createForm();
 }

  createForm() {
    this.angForm = this.fb.group({
      ProductName: ['', Validators.required ],
      ProductDescription: ['', Validators.required ],
      ProductPrice: ['', Validators.required ]
    });
  }

  ngOnInit() {
    this.route.params.subscribe(params => {
        this.ps.editProduct(params['id']).subscribe(res => {
          this.product = res;
      });
    });
  }
}
di dalam products.service.ts tambhkan fungsi editProduct
// products.service.ts

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';

@Injectable({
  providedIn: 'root'
})
export class ProductsService {

  uri = 'http://localhost:4000/products';

  constructor(private http: HttpClient) { }

  addProduct(ProductName, ProductDescription, ProductPrice) {
    console.log(ProductName, ProductDescription, ProductPrice);
    const obj = {
      ProductName,
      ProductDescription,
      ProductPrice
    };
    this.http.post(`${this.uri}/add`, obj)
        .subscribe(res => console.log('Done'));
  }

  getProducts() {
    return this
           .http
           .get(`${this.uri}`);
  }

  editProduct(id) {
    return this
            .http
            .get(`${this.uri}/edit/${id}`);
    }
}
kemudian kita buat html form untuk edit dengan nama product-edit.component.html
<!-- product-edit.component.html -->

<div class="card">
  <div class="card-body">
    <form [formGroup]="angForm" novalidate>
      <div class="form-group">
        <label class="col-md-4">Product Name</label>
        <input type="text" class="form-control" 
          formControlName="ProductName" 
          #ProductName 
          [(ngModel)] = "product.ProductName"/>
      </div>
      <div *ngIf="angForm.controls['ProductName'].invalid && (angForm.controls['ProductName'].dirty || angForm.controls['ProductName'].touched)" class="alert alert-danger">
        <div *ngIf="angForm.controls['ProductName'].errors.required">
          Product Name is required.
        </div>
      </div>
      <div class="form-group">
        <label class="col-md-4">Product Description </label>
        <textarea class="form-control" rows = 7 cols = "5"
        formControlName="ProductDescription" 
        #ProductDescription [(ngModel)] = "product.ProductDescription"></textarea>
      </div>
      <div *ngIf="angForm.controls['ProductDescription'].invalid && (angForm.controls['ProductDescription'].dirty || angForm.controls['ProductDescription'].touched)" class="alert alert-danger">
        <div *ngIf="angForm.controls['ProductDescription'].errors.required">
          Product Description is required.
        </div>
      </div>
      <div class="form-group">
        <label class="col-md-4">Product Price</label>
        <input type="text" class="form-control" 
          formControlName="ProductPrice" 
          #ProductPrice
          [(ngModel)] = "product.ProductPrice"
        />
      </div>
      <div *ngIf="angForm.controls['ProductPrice'].invalid && (angForm.controls['ProductPrice'].dirty || angForm.controls['ProductPrice'].touched)" class="alert alert-danger">
        <div *ngIf="angForm.controls['ProductPrice'].errors.required">
          Product Price is required.
        </div>
      </div>
      <div class="form-group">
        <button (click) = "updateProduct(ProductName.value, ProductDescription.value, ProductPrice.value)" type="submit" class="btn btn-primary"
        [disabled]="angForm.invalid" >
          Update Product
        </button>
      </div>
    </form>
  </div>
</div>
sekarang kita tambhkan fungsi update di products.service.ts
// products.service.ts

updateProduct(ProductName, ProductDescription, ProductPrice, id) {
    const obj = {
      ProductName,
      ProductDescription,
      ProductPrice
    };
    this
      .http
      .post(`${this.uri}/update/${id}`, obj)
      .subscribe(res => console.log('Done'));
}
Kemudian buat fungsi updateProduct di product-edit.component.ts
// product-edit.component.ts

updateProduct(ProductName, ProductDescription, ProductPrice, id) {
    this.route.params.subscribe(params => {
      this.ps.updateProduct(ProductName, ProductDescription, ProductPrice, params.id);
      this.router.navigate(['products']);
    });
  }

#17 Delete Data

Pertama-tama definisikan dulu click even pada tombol delete di product-get.component.html
<!-- product-get.component.html -->

<tbody>
      <tr *ngFor="let product of products">
          <td>{{ product.ProductName }}</td>
          <td>{{ product.ProductDescription }}</td>
          <td>{{ product.ProductPrice }}</td>
          <td><a [routerLink]="['/edit', product._id]" class="btn btn-primary">Edit</a></td>
          <td><a (click) = "deleteProduct(product._id)" class="btn btn-danger">Delete</a>
      </tr>
  </tbody>
Sekarang buat fungsi deleteProduct function di dalam file product-get.component.ts
// product-get.component.ts

deleteProduct(id) {
    this.ps.deleteProduct(id).subscribe(res => {
      this.products.splice(id, 1);
    });
}
Sekarang buat fungsi deleteProduct() di dalam file product.service.ts kita akan mengirimkan ID dengan AJAx request untuk menghapus data dari backend
// products.service.ts

deleteProduct(id) {
    return this
              .http
              .get(`${this.uri}/delete/${id}`);
  }
Akhirnya Selesai juga CRUD nya, jika kode diatas ada yang kurang jelas saya sudah menguploadnya di github,
terimakasih telah mengikuti tutorial ini semoga bermanfaat jika ada yang kurang silkan ditanyakan pada kolom komentar, jika artikel ini bermanfaat silakan di share terimakasih.

Membuat Halaman Login di Android dengan Firebase

Halo selamat siang pada kesempatan kali ini kita akan membuat halaman Login di Android dengan Firebase, untuk membuat login dengan Firebase sangat mudah kita tinggal memanfaatkan fungsi authentikasi dari firebase, fungsi authentikasi firebase ini sangat lengkap kita bisa login lewat facebook, google akun, twitter, email, no handphone dll, namun yang akan kita bahas pada tutorial kali ini yaitu login lewat Email dan Password.

Untuk membuat Login dengan Email/Password di Firebase Langkah pertama kita aktifkan dulu signin method nya di Firebase Console, caranya yaitu anda Login dulu ke Firebase kemudian pilih projek anda yang akan menggunakan authentikasi kemudian pada tab develop di samping kiri pilih authentication -> sign-in method -> pilih provider yang akan digunakan untuk melakukan authentikasi disini saya menggunakan provider Email/Password -> pada status pilih enable.


kemudian pada tab users tambahkan user yang akan digunakan untuk login nantinya karena pada tutorial kali ini kita tidak akan membuat register jadi usernya dimasukan secara manual dari firebase



Buka Projek Android anda yang akan ditambahkan authentikasi melalui firebase kemudian sambungkan projek anda dengan firebase lihat: cara menyambungkan projek androidke firebase
kemudian tambahkan despendency firebase auth di build.gradle
compile 'com.google.firebase:firebase-auth:11.6.2'

selanjutnya buat activity baru dan tambhkan dua buah editTeks untuk email dan password kemudian tambhkan sebuah button untuk submit, atur tampilanya agar terlihat lebih cantik seperti ini:


xml version="1.0" encoding="utf-8"?>

xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:app="http://schemas.android.com/apk/res-auto"

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:padding="10dp"

    android:background="@color/colorPrimary"

    tools:context="giviews.id.fireapp.LoginActivity">



    
        android:id="@+id/logoImage"

        android:layout_width="100dp"

        android:layout_height="130dp"

        android:layout_marginTop="20dp"

        android:layout_centerHorizontal="true"

        android:src="@drawable/logo"

        android:textAlignment="center" />



    
        android:id="@+id/txtLogo"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:text="Firebase Login"

        android:gravity="center"

        android:textColor="#ffffff"

        android:layout_below="@+id/logoImage"

        android:textSize="25sp"/>



    
        android:id="@+id/email"

        android:background="@drawable/input_background"

        android:padding="15dp"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:hint="Email ..."

        android:textColor="#807f7f"

        android:layout_below="@+id/txtLogo"

        android:layout_marginTop="60dp"

        android:inputType="textEmailAddress" />



    
        android:id="@+id/password"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:hint="Password ..."

        android:background="@drawable/input_background"

        android:padding="15dp"

        android:textColor="#807f7f"

        android:layout_marginTop="20dp"

        android:layout_below="@+id/email"

        android:inputType="textPassword" />



        android:id="@+id/loginBtn"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:layout_below="@+id/password"

        android:background="@drawable/btn_background"

        android:padding="15dp"

        android:textColor="@color/colorPrimary"

        android:layout_marginTop="20dp"

        android:textSize="20dp"

        android:text="Sign In"/>


untuk background Edit Teksnya buat file input_backgrounds.xml di drawable dan masukan kode berikut:
xml version="1.0" encoding="utf-8"?>

xmlns:android="http://schemas.android.com/apk/res/android">

    android:color="#fff" />

    android:radius="5dp" />


dan buat lagi file btn_background.xml di drawable untuk background button nya:
xml version="1.0" encoding="utf-8"?>

xmlns:android="http://schemas.android.com/apk/res/android">

    android:color="@color/colorAccent" />

    android:radius="5dp" />


kemudian untuk javanya masukan kode berikut:
package giviews.id.fireapp;



import android.content.Intent;

import android.support.annotation.NonNull;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.text.TextUtils;

import android.view.View;

import android.view.WindowManager;

import android.widget.Button;

import android.widget.EditText;

import android.widget.Toast;



import com.google.android.gms.tasks.OnCompleteListener;

import com.google.android.gms.tasks.Task;

import com.google.firebase.auth.AuthResult;

import com.google.firebase.auth.FirebaseAuth;



public class LoginActivity extends AppCompatActivity {



    private EditText mEmailField;

    private EditText mPasswordField;

    private Button mloginBtn;



    private FirebaseAuth mAuth;

    private FirebaseAuth.AuthStateListener mAuthListener;



    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_login);



        //Membuat FullScreen

        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);



        mEmailField = (EditText) findViewById(R.id.email);

        mPasswordField = (EditText) findViewById(R.id.password);

        mloginBtn = (Button) findViewById(R.id.loginBtn);



        mAuth = FirebaseAuth.getInstance();



        mAuthListener = new FirebaseAuth.AuthStateListener() {

            @Override

            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {

                if (firebaseAuth.getCurrentUser() != null) {

                    startActivity(new Intent(LoginActivity.this, MainActivity.class) );

                }

            }

        };



        mloginBtn.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                startSignIn();

            }

        });

    }



    @Override

    protected void onStart() {

        super.onStart();



        mAuth.addAuthStateListener(mAuthListener);

    }



    private void startSignIn() {

        String email = mEmailField.getText().toString();

        String password = mPasswordField.getText().toString();



        if (TextUtils.isEmpty(email) | TextUtils.isEmpty(password)) {

            Toast.makeText(LoginActivity.this, "Fields are Empty", Toast.LENGTH_SHORT).show();

        } else {



            mAuth.signInWithEmailAndPassword(email, password).addOnCompleteListener(new OnCompleteListener() {

                @Override

                public void onComplete(@NonNull Task task) {



                    if (!task.isSuccessful()) {

                        Toast.makeText(LoginActivity.this, "Login Problem", Toast.LENGTH_SHORT).show();

                    }



                }

            });

        }

    }

}

Jika Login berhasil akan masuk ke MainActivity untuk isi main Activity bisa anda buat Tulisan Login Berhasil Pada TeksView, kemudian bisa anda tambahkan sebuah button untuk logout, kode logout sangat simple hanya mAuth.signOut();

Ok sekianlah tutorial kali ini pada postingan yang lain kita akan membuat cara membuat halaman registrasi dengan firebase, selamat mencoba semoga bermanfaat, jika ada yang ditanyakan silakan kirimkan pertanyaan anda pada kolom komentar dibawah