Blog

  • Pratikum 4

    Pendahuluan

    Perkembangan teknologi mobile saat ini sangat pesat, terutama dengan adanya framework Flutter yang memungkinkan pengembangan aplikasi lintas platform dengan efisiensi tinggi. Dalam pembuatan aplikasi, salah satu aspek penting yang harus diperhatikan adalah navigasi antar halaman (screen) dan pengelolaan data antar halaman. Navigasi yang baik memberikan pengalaman pengguna (user experience) yang lebih interaktif dan mudah dipahami.

    Praktikum ini bertujuan untuk mempelajari konsep Navigation dan Routing pada Flutter, yaitu cara berpindah dari satu halaman ke halaman lain serta cara mengirim dan menerima data antar halaman. Melalui kegiatan ini, mahasiswa diharapkan mampu memahami penggunaan Navigator, Named Routes, serta implementasi berbagai jenis routing yang sering digunakan dalam pengembangan aplikasi Flutter modern. Selain itu, praktikum juga mencakup pembuatan halaman Login dan Home, yang menjadi dasar dari hampir semua aplikasi mobile.

    Dengan memahami konsep ini, pengembang aplikasi dapat membangun struktur aplikasi yang terorganisir, mudah dikelola, dan memiliki alur navigasi yang jelas antara berbagai fitur di dalam aplikasi.

    Langkah Pengerjaan

    1.Multiple Screen

    import ‘package:flutter/material.dart’;

    void main() => runApp(const MyNav());

    class MyNav extends StatelessWidget {
    const MyNav({super.key});

    @override
    Widget build(BuildContext context) {
    return MaterialApp(
    initialRoute: ‘/’,
    routes: {
    ‘/’: (context) => const Product(),
    ‘/product_detail’: (context) => const ProductDetail(),
    },
    );
    }
    }

    class Product extends StatelessWidget {
    const Product({super.key});

    @override
    Widget build(BuildContext context) {
    return Scaffold(
    appBar: AppBar(title: const Text(‘Product’)),
    body: Center(
    child: ElevatedButton(
    onPressed: () {
    Navigator.pushNamed(context, ‘/product_detail’);
    },
    child: const Text(‘Go to Product Detail’),
    ),
    ),
    );
    }
    }

    class ProductDetail extends StatelessWidget {
    const ProductDetail({super.key});

    @override
    Widget build(BuildContext context) {
    return Scaffold(
    appBar: AppBar(title: const Text(‘Product Detail’)),
    body: Center(
    child: ElevatedButton(
    onPressed: () {
    Navigator.pop(context);
    },
    child: const Text(‘Back to Product’),
    ),
    ),
    );
    }
    }

    2.Mengirim dan Menerima Data antar Halaman

    import ‘package:flutter/material.dart’;

    void main() => runApp(MyNav());

    class MyNav extends StatelessWidget {
    const MyNav({super.key});

    @override
    Widget build(BuildContext context) {
    return MaterialApp(
    initialRoute: ‘/’,
    routes: {
    ‘/’: (context) => const HomePage(),
    ‘/product’: (context) => const MyProduct(),
    },
    );
    }
    }

    class HomePage extends StatelessWidget {
    const HomePage({super.key});

    @override
    Widget build(BuildContext context) {
    return Scaffold(
    appBar: AppBar(title: const Text(‘Home Page’)),
    body: Center(
    child: Row(
    children: [
    ElevatedButton(
    onPressed: () {
    Navigator.push(
    context,
    MaterialPageRoute(
    builder: (context) => const MyProfile(id: 01, name: ‘Kaela’),
    ),
    );
    },
    child: const Text(‘Profile’),
    ),
    ElevatedButton(
    onPressed: () {
    Navigator.pushNamed(
    context,
    ‘/product’,
    arguments: {‘id’: 1, ‘name’: ‘Hp’},
    );
    },
    child: const Text(‘Product’),
    ),
    ],
    ),
    ),
    );
    }
    }

    class MyProfile extends StatelessWidget {
    final int id;
    final String name;
    const MyProfile({super.key, required this.id, required this.name});

    @override
    Widget build(BuildContext context) {
    return Scaffold(
    appBar: AppBar(title: const Text(‘Profile’)),
    body: Center(
    child: Column(
    mainAxisAlignment: MainAxisAlignment.center,
    children: [
    Text(‘ID: $id’),
    Text(‘Name: $name’),
    ],
    ),
    ),
    );
    }
    }

    class MyProduct extends StatelessWidget {
    const MyProduct({super.key});

    @override
    Widget build(BuildContext context) {
    final args = ModalRoute.of(context)!.settings.arguments as Map?;
    final int id = args?[‘id’] ?? 0;
    final String name = args?[‘name’] ?? ‘Unknown’;

    return Scaffold(
      appBar: AppBar(title: const Text('Product')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text('Product ID: $id'),
            Text('Product Name: $name'),
          ],
        ),
      ),
    );

    }
    }

    Tugas:

    Buat halaman login dan halaman utama.
    Ketika login diklik, halaman berpindah ke HomePage dengan mengirimkan username dan password, lalu ditampilkan di halaman utama.

    import ‘package:flutter/material.dart’;

    void main() {
    runApp(const MyApp());
    }

    class MyApp extends StatelessWidget {
    const MyApp({super.key});

    @override
    Widget build(BuildContext context) {
    return MaterialApp(
    debugShowCheckedModeBanner: false,
    title: ‘Navigation Demo’,
    home: const LoginPage(),
    );
    }
    }

    class LoginPage extends StatefulWidget {
    const LoginPage({super.key});

    @override
    State createState() => _LoginPageState();
    }

    class _LoginPageState extends State {
    final TextEditingController usernameController = TextEditingController();
    final TextEditingController passwordController = TextEditingController();

    @override
    Widget build(BuildContext context) {
    return Scaffold(
    appBar: AppBar(title: const Text(“Login Page”)),
    body: Padding(
    padding: const EdgeInsets.all(20),
    child: Column(
    mainAxisAlignment: MainAxisAlignment.center,
    children: [
    TextField(
    controller: usernameController,
    decoration: const InputDecoration(labelText: “Username”),
    ),
    TextField(
    controller: passwordController,
    obscureText: true,
    decoration: const InputDecoration(labelText: “Password”),
    ),
    const SizedBox(height: 20),
    ElevatedButton(
    onPressed: () {
    String username = usernameController.text;
    String password = passwordController.text;

                Navigator.push(
                  context,
                  MaterialPageRoute(
                    builder: (context) =>
                        HomePage(username: username, password: password),
                  ),
                );
              },
              child: const Text("Login"),
            )
          ],
        ),
      ),
    );

    }
    }

    class HomePage extends StatelessWidget {
    final String username;
    final String password;

    const HomePage({super.key, required this.username, required this.password});

    @override
    Widget build(BuildContext context) {
    return DefaultTabController(
    length: 3,
    child: Scaffold(
    appBar: AppBar(
    title: const Text(“Home Page”),
    bottom: const TabBar(
    tabs: [
    Tab(icon: Icon(Icons.home), text: “Tab 1”),
    Tab(icon: Icon(Icons.star), text: “Tab 2”),
    Tab(icon: Icon(Icons.person), text: “Tab 3”),
    ],
    ),
    ),
    drawer: Drawer(
    child: ListView(
    children: [
    DrawerHeader(
    decoration: const BoxDecoration(color: Colors.blue),
    child: Text(“Hello, $username”,
    style: const TextStyle(color: Colors.white, fontSize: 20)),
    ),
    ListTile(
    leading: const Icon(Icons.info),
    title: const Text(“User Info”),
    onTap: () {
    Navigator.pop(context);
    ScaffoldMessenger.of(context).showSnackBar(
    SnackBar(content: Text(“Password: $password”)),
    );
    },
    ),
    ListTile(
    leading: const Icon(Icons.exit_to_app),
    title: const Text(“Logout”),
    onTap: () {
    Navigator.pop(context);
    Navigator.pop(context);
    },
    ),
    ],
    ),
    ),
    body: TabBarView(
    children: [
    Center(
    child: Column(
    mainAxisAlignment: MainAxisAlignment.center,
    children: [
    Text(“Welcome, $username!”,
    style: const TextStyle(fontSize: 22)),
    const SizedBox(height: 10),
    Text(“Password: $password”,
    style: const TextStyle(fontSize: 18)),
    ],
    ),
    ),
    const Center(child: Text(“This is Tab 2”)),
    const Center(child: Text(“This is Tab 3”)),
    ],
    ),
    bottomNavigationBar: const MyBottomNav(),
    ),
    );
    }
    }

    class MyBottomNav extends StatefulWidget {
    const MyBottomNav({super.key});

    @override
    State createState() => _MyBottomNavState();
    }

    class _MyBottomNavState extends State {
    int _selectedIndex = 0;

    final List _pages = [“🏠 Home”, “⭐ Favorite”, “⚙️ Settings”];

    @override
    Widget build(BuildContext context) {
    return BottomNavigationBar(
    currentIndex: _selectedIndex,
    onTap: (index) {
    setState(() {
    _selectedIndex = index;
    ScaffoldMessenger.of(context).showSnackBar(
    SnackBar(content: Text(“You selected: ${_pages[index]}”)),
    );
    });
    },
    items: const [
    BottomNavigationBarItem(icon: Icon(Icons.home), label: “Home”),
    BottomNavigationBarItem(icon: Icon(Icons.star), label: “Favorite”),
    BottomNavigationBarItem(icon: Icon(Icons.settings), label: “Settings”),
    ],
    );
    }
    }

    Kesimpulan

    Berdasarkan hasil praktikum yang telah dilakukan, dapat disimpulkan bahwa Navigation dan Routing merupakan komponen fundamental dalam pengembangan aplikasi Flutter. Melalui penerapan multiple screen, aplikasi dapat berpindah antar halaman dengan lancar, baik menggunakan metode Navigator push/pop maupun Named Routes.

    Selain itu, proses pengiriman dan penerimaan data antar halaman berhasil diimplementasikan menggunakan konstruktor dan argumen pada named routes. Tugas tambahan berupa pembuatan halaman Login dan Home juga memperlihatkan bagaimana data dari pengguna dapat ditransfer dan ditampilkan kembali di halaman lain menggunakan stateful widget dan navigator.

    Dengan demikian, praktikum ini memberikan pemahaman menyeluruh tentang bagaimana sistem navigasi bekerja dalam Flutter serta bagaimana mengatur alur perpindahan data antar halaman, yang menjadi dasar penting dalam pengembangan aplikasi mobile berskala besar.

  • Pratikum 3

    Aplikasi Mobile

    Berikut adalah contoh pendahuluan laporan praktikum untuk aplikasi Kalkulator Kabataku (Kali, Bagi, Tambah, Kurang) yang kamu buat menggunakan Flutter:


    Pendahuluan

    Dalam pengembangan aplikasi mobile, kemampuan menerima input dari pengguna dan memberikan respon yang sesuai merupakan elemen penting untuk menciptakan interaksi yang efektif. Flutter, sebagai framework UI modern dari Google, menyediakan berbagai widget yang memungkinkan pembuatan antarmuka pengguna yang responsif dan intuitif.

    Pada praktikum ini, mahasiswa diminta untuk membuat sebuah aplikasi kalkulator sederhana yang mampu melakukan operasi dasar matematika yaitu penjumlahan (tambah), pengurangan (kurang), perkalian (kali), dan pembagian (bagi) — atau dikenal dengan istilah Kabataku. Proyek ini bertujuan untuk melatih kemampuan mahasiswa dalam menggunakan widget seperti TextField, TextFormField, ElevatedButton, dan Text, serta memahami cara menangani input, melakukan validasi, dan menampilkan hasil perhitungan secara dinamis menggunakan setState().

    Pembuatan aplikasi kalkulator ini juga melibatkan pemahaman dasar mengenai struktur kode Flutter, penggunaan controller pada form input, serta pengelolaan state pada aplikasi berbasis widget. Melalui praktikum ini, diharapkan mahasiswa dapat lebih memahami konsep dasar pembuatan form, interaksi user, dan logika sederhana dalam pengembangan aplikasi mobile menggunakan Flutter.


    TUJUAN:

    • Membuat beberapa input widgets
    • Membuat dan mengontrol inputan dari user

    TEORI

    Dalam pengembangan antarmuka pengguna pada aplikasi Flutter, salah satu bagian penting yang sering digunakan adalah Basic Form. Basic Form merupakan sekumpulan widget yang digunakan untuk menerima input dari pengguna. Widget-widget ini meliputi TextField, TextFormField, Checkbox, Switch, Dropdown, Radio, Dialog, DatePicker, BottomSheet, Snackbar, dan lain sebagainya. Form tidak hanya menampilkan elemen input, tetapi juga menyediakan mekanisme untuk validasi dan pengelolaan data input. Ketika pengguna mengisi form, data yang dimasukkan akan divalidasi berdasarkan aturan yang telah ditentukan, dan hasil input tersebut dapat diambil dan diproses lebih lanjut setelah validasi berhasil.

    Salah satu widget dasar yang paling sering digunakan untuk menerima input teks adalah TextField. Widget ini menyediakan kotak input di mana pengguna dapat mengetikkan teks, dan sering digunakan dalam berbagai kebutuhan seperti formulir login, pencarian, atau masukan komentar. TextField memiliki berbagai properti untuk mengatur gaya teks (style), dekorasi (decoration), serta jenis inputan seperti angka, email, atau teks biasa. Untuk mengelola isi dari TextField, Flutter menyediakan objek TextEditingController yang dapat digunakan untuk mengambil nilai teks, membersihkannya, atau mengatur isinya secara manual.

    Selain TextField, Flutter juga menyediakan TextFormField, yang merupakan versi lebih lengkap dan canggih. TextFormField sudah terintegrasi dengan sistem form Flutter, yang memungkinkan pengguna untuk secara langsung menerapkan validasi input melalui properti validator. Dengan validator, kita bisa menentukan aturan validasi seperti memastikan input tidak kosong, memenuhi panjang minimal, atau sesuai format tertentu. Jika validasi gagal, maka TextFormField akan secara otomatis menampilkan pesan kesalahan. TextFormField juga dapat berinteraksi dengan objek FormState, yang mengelola status keseluruhan dari Form. Hal ini sangat berguna dalam aplikasi yang memiliki lebih dari satu input field dan membutuhkan validasi secara menyeluruh.

    Untuk menghubungkan widget Form dengan objek FormState, Flutter menggunakan GlobalKey. GlobalKey adalah objek unik yang digunakan untuk mengakses dan mengontrol status suatu widget secara global dari luar widget itu sendiri. Dengan GlobalKey, kita bisa memanggil method seperti validate() atau save() dari tombol aksi seperti ElevatedButton. Hal ini memungkinkan interaksi antara input form dan kontrol UI eksternal dalam aplikasi.

    Objek FormState sendiri merupakan kelas yang berfungsi untuk menyimpan dan mengatur status dari Form, termasuk status validasi dan data yang diinputkan. Saat kita menggunakan GlobalKey untuk mengakses FormState, kita bisa menjalankan fungsi validate() yang akan memeriksa semua inputan di dalam Form sekaligus. Jika semua validasi berhasil, maka fungsi ini akan mengembalikan nilai true, dan kita bisa melanjutkan ke proses penyimpanan atau perhitungan data.

    Selain validasi dan input data, Flutter juga menggunakan method setState() untuk memperbarui tampilan aplikasi ketika terjadi perubahan data. Method ini digunakan untuk memberitahu framework bahwa ada perubahan pada state aplikasi, sehingga Flutter akan melakukan rebuild pada widget terkait dan memperbarui tampilannya secara otomatis di layar. setState() sangat penting dalam aplikasi interaktif seperti kalkulator, di mana hasil perhitungan perlu ditampilkan kembali setelah tombol ditekan.

    Terakhir, penggunaan kata kunci const dalam Flutter digunakan untuk mendeklarasikan widget yang nilainya tidak akan berubah saat aplikasi dijalankan. Widget yang dideklarasikan sebagai const hanya akan dibangun satu kali pada waktu kompilasi (compile-time), sehingga dapat meningkatkan performa aplikasi karena Flutter tidak perlu membangun ulang widget tersebut jika tidak diperlukan. Ini merupakan salah satu praktik yang disarankan untuk mengoptimalkan kinerja aplikasi Flutter.

    Secara keseluruhan, pemahaman terhadap konsep-konsep seperti TextField, TextFormField, Form, FormState, GlobalKey, validate(), setState(), dan const sangat penting dalam membangun aplikasi mobile berbasis Flutter, terutama yang melibatkan input dan interaksi pengguna secara langsung.

    LANGKAH PENGERJAAN:

    Langkah 1: Membuat File Baru dengan Nama form_textfield.dart

    Dalam file ini, kita akan menampilkan sebuah form sederhana menggunakan widget TextField sebagai tempat untuk memasukkan data. Selain itu, kita juga menambahkan sebuah tombol ElevatedButton yang berfungsi sebagai pemicu aksi saat ditekan.

    Langkah 2: Membuat File dengan Nama form_textformfield.dart

    Di dalam file ini, kita akan membuat beberapa variabel penting seperti GlobalKey untuk mengelola state form, TextEditingController untuk mengontrol input dari TextFormField, serta fungsi yang berguna untuk mengosongkan isi input nama dan email. Selain itu, kita juga akan menyiapkan fungsi yang akan dijalankan saat tombol ditekan.

    KESIMPULAN

    Dari pembahasan mengenai Basic Form dan komponen-komponen pendukungnya pada Flutter, dapat disimpulkan bahwa penggunaan widget seperti TextField dan TextFormField sangat penting untuk menerima dan mengelola input dari pengguna secara efektif. TextFormField menawarkan kelebihan dalam hal validasi otomatis yang terintegrasi dengan sistem form, sehingga memudahkan pengelolaan data dan pengecekan kesalahan input.

    Selain itu, peran GlobalKey dan FormState sangat krusial dalam mengontrol dan memvalidasi seluruh form secara keseluruhan, sehingga aplikasi dapat memastikan data yang dimasukkan sudah sesuai dengan aturan sebelum diproses lebih lanjut. Penggunaan method validate() pada FormState memudahkan pelaksanaan validasi secara kolektif.

    Penggunaan method setState() membantu dalam memperbarui tampilan aplikasi secara dinamis ketika terjadi perubahan data, sedangkan kata kunci const berguna untuk meningkatkan performa aplikasi dengan mendeklarasikan widget yang bersifat konstan.

    Secara keseluruhan, pemahaman dan penerapan konsep-konsep ini sangat membantu dalam membangun aplikasi Flutter yang responsif, interaktif, dan dapat menangani input pengguna dengan baik serta menjaga kualitas data yang diterima.

  • Pratikum 2

    Nama : Nia Ramadhani

    Nim : 2311531006

    aplikasi mobile

    PENDAHULUAN

    Perkembangan teknologi mobile yang semakin pesat menuntut para pengembang perangkat lunak untuk menciptakan aplikasi yang tidak hanya fungsional tetapi juga memiliki antarmuka yang menarik, interaktif, dan dapat berjalan lintas platform dengan efisien. Salah satu solusi modern untuk memenuhi kebutuhan tersebut adalah Flutter, sebuah framework UI open-source yang dikembangkan oleh Google. Flutter memungkinkan pengembangan aplikasi untuk Android, iOS, web, dan desktop hanya dengan satu basis kode (single codebase), sehingga lebih hemat waktu dan biaya dalam proses pengembangan serta pemeliharaan aplikasi.

    Flutter menggunakan bahasa pemrograman Dart, yang dirancang untuk membangun antarmuka pengguna yang cepat dan responsif. Salah satu kekuatan utama Flutter terletak pada pendekatan deklaratif dalam membangun UI, yang berpusat pada konsep widget. Setiap elemen dalam Flutter, baik itu teks, tombol, gambar, maupun layout, dibangun dari widget. Oleh karena itu, memahami konsep widget merupakan langkah awal yang sangat krusial bagi siapa pun yang ingin mengembangkan aplikasi menggunakan Flutter.

    Terdapat dua jenis utama widget di Flutter, yaitu Stateless Widget dan Stateful Widget. Stateless Widget digunakan ketika tampilan UI tidak tergantung pada perubahan data, sedangkan Stateful Widget digunakan ketika UI perlu merespons perubahan data secara dinamis. Perbedaan mendasar antara keduanya sangat berpengaruh dalam desain dan arsitektur aplikasi, terutama dalam hal pengelolaan state atau kondisi aplikasi.

    Selain memahami konsep dasar widget, pengembang juga perlu menguasai penggunaan basic widgets seperti Text, Image, Row, Column, Container, Button, dan lain sebagainya. Widget-widget dasar ini menjadi fondasi dalam membangun struktur dan tampilan antarmuka yang lebih kompleks.

    Namun, sebelum mulai membangun aplikasi Flutter, langkah awal yang tidak kalah penting adalah melakukan setup environment Flutter pada perangkat pengembang. Proses ini meliputi instalasi Flutter SDK, pengaturan PATH environment, instalasi editor seperti Visual Studio Code atau Android Studio, serta pengaturan emulator atau perangkat fisik sebagai media pengujian aplikasi. Setup yang benar dan optimal akan mempermudah proses development, debugging, serta deployment aplikasi.

    Dengan latar belakang tersebut, pembahasan ini akan difokuskan pada bagaimana melakukan setup Flutter untuk pengembangan, memahami perbedaan Stateless dan Stateful Widget, serta mengenal berbagai basic widgets yang digunakan dalam membangun antarmuka pengguna aplikasi.

    Tujuan Pratikum

    1.Menjelaskan langkah-langkah dalam melakukan setup lingkungan pengembangan Flutter pada komputer.

    2.Memahami perbedaan antara Stateless Widget dan Stateful Widget, serta kapan penggunaannya tepat dalam pengembangan aplikasi.

    3.Mengenal dan mempraktikkan penggunaan basic widgets untuk membangun tampilan dasar aplikasi Flutter.

    4.Memberikan pemahaman praktis tentang struktur dasar aplikasi Flutter dan cara membangun antarmuka pengguna secara efisien.

    LANGKAH PENGERJAAN

    Install GIT dan konfigurasi sesuai wizard instalasi

    Install Android Studio — agar bisa menggunakan Android SDK Manager & emulator.

    Install Visual Studio Code dan tambahkan ekstensi Flutter.

    Download / extract SDK Flutter, lalu tambahkan path SDK ke environment variables.

    Periksa instalasi Flutter

    Buka terminal / command prompt, jalankan perintah flutter doctor.

    Jika semua dependensi terpasang dengan benar, tampilan output akan menunjukkan status “all good” atau menunjukkan apa yang masih kurang.

    Buat proyek Flutter baru

    Ketikkan flutter create hai di terminal untuk membuat proyek baru bernama “hai”.

    Setelah itu masuk ke folder proyek dengan cd hai.

    Jalankan proyek

    Jalankan flutter run untuk menjalankan proyek ke emulator / perangkat fisik.

    Pilih target perangkat bila diminta.

    Buka dan kelola proyek di VS Code

    Buka proyek “hai” di Visual Studio Code.

    Struktur folder proyek

    ios → konfigurasi iOS (Info.plist, dll)

    test → untuk file testing

    pubspec.yaml → file konfigurasi proyek

    README.md → deskripsi & petunjuk

    gitignore → atur file/folder yang diabaikan oleh Git

    Membuat widget stateless

    Buat file baru di folder lib bernama stateless.dart.

    Tulis kode widget stateless sesuai contoh.

    Jalankan / lihat hasilnya.

    Membuat widget stateful

    Buat file statefull.dart (biasanya stateful.dart) di folder lib.

    Tulis kode widget stateful sesuai contoh — widget yang bisa berubah ketika state berubah (misal ketika tombol ditekan, input berubah, dsb).

    Jalankan / lihat hasilnya.

    Menggunakan widget dasar (basic widget)

    Gunakan widget seperti Text, Container, ElevatedButton, Icon, Image, CircleAvatar, dll untuk membuat antarmuka sederhana.

    Kombinasikan widget vertikal dan horizontal (Column, Row) sesuai tugas yang diberikan.

    KESIMPULAN

    Melalui praktikum ini dapat disimpulkan bahwa proses instalasi dan konfigurasi lingkungan kerja merupakan tahapan yang sangat penting agar Flutter dapat dijalankan dengan baik. Setelah semua tools berhasil dipasang, mahasiswa dapat memahami perbedaan mendasar antara widget stateless dan stateful. Widget stateless digunakan ketika tampilan bersifat statis dan tidak berubah akibat interaksi, sedangkan widget stateful digunakan untuk membangun tampilan yang dinamis dan mampu menyesuaikan diri terhadap perubahan data maupun input pengguna.

    Selain itu, penggunaan basic widget seperti Text, Container, ElevatedButton, Icon, Image, dan CircleAvatar memberikan gambaran nyata bagaimana elemen antarmuka dasar dibangun dalam aplikasi Flutter. Dengan memanfaatkan kombinasi layout vertikal (Column) dan horizontal (Row), tampilan aplikasi dapat diatur secara lebih fleksibel dan rapi. Tugas yang diberikan, baik dalam membuat layout sederhana maupun tampilan profil dengan memanfaatkan berbagai widget dasar, membantu memperkuat pemahaman konsep sekaligus melatih keterampilan praktis dalam merancang antarmuka aplikasi.

    Secara keseluruhan, praktikum ini memberikan pengalaman langsung yang tidak hanya memperdalam pemahaman teori, tetapi juga mengasah keterampilan teknis dalam membangun aplikasi Flutter. Hambatan kecil seperti pengaturan tata letak atau penyesuaian properti widget justru menjadi bagian penting dari proses pembelajaran yang memperkaya pemahaman mahasiswa terhadap pengembangan aplikasi mobile berbasis Flutter.


    TUGAS

    1. Membuat tampilan widget secara vertical dan horizontal dengan menggunakan minimal 3 buah basic widget dalam 1 tampilan

    import ‘package:flutter/material.dart’;

    void main() {

    runApp(const LayoutWidgetsApp());

    }

    class LayoutWidgetsApp extends StatelessWidget {

    const LayoutWidgetsApp({super.key});

    @override

    Widget build(BuildContext context) {

    return const MaterialApp(

    debugShowCheckedModeBanner: false,

    home: LayoutWidgetsPage(),

    );

    }

    }

    class LayoutWidgetsPage extends StatelessWidget {

    const LayoutWidgetsPage({super.key});

    @override

    Widget build(BuildContext context) {

    return Scaffold(

    appBar: AppBar(

    title: const Text(“Vertical & Horizontal Layout”),

    backgroundColor: Colors.teal,

    ),

    body: Center(

    child: Column(

    mainAxisAlignment: MainAxisAlignment.center,

    children: [

    Row(

    mainAxisAlignment: MainAxisAlignment.center,

    children: [

    Container(

    width: 80,

    height: 80,

    margin: const EdgeInsets.all(8),

    decoration: BoxDecoration(

    color: Colors.orange,

    borderRadius: BorderRadius.circular(12),

    ),

    child: const Icon(Icons.home, color: Colors.white, size: 40),

    ),

    const SizedBox(width: 20),

    Container(

    width: 80,

    height: 80,

    margin: const EdgeInsets.all(8),

    decoration: BoxDecoration(

    color: Colors.blue,

    borderRadius: BorderRadius.circular(12),

    ),

    child: const Icon(Icons.star, color: Colors.white, size: 40),

    ),

    ],

    ),

    const SizedBox(height: 30),

    Container(

    width: 250,

    padding: const EdgeInsets.all(16),

    decoration: BoxDecoration(

    color: Colors.green[100],

    borderRadius: BorderRadius.circular(12),

    border: Border.all(color: Colors.green, width: 2),

    ),

    child: Column(

    crossAxisAlignment: CrossAxisAlignment.center,

    children: [

    const Text(

    “Tugas Flutter”,

    style: TextStyle(

    fontSize: 18,

    fontWeight: FontWeight.bold,

    ),

    ),

    const SizedBox(height: 10),

    const Text(“Contoh Layout Vertical + Horizontal”),

    const SizedBox(height: 10),

    ElevatedButton(

    onPressed: () {

    ScaffoldMessenger.of(context).showSnackBar(

    const SnackBar(content: Text(“Tombol ditekan”)),

    );

    },

    child: const Text(“Klik Saya”),

    ),

    ],

    ),

    ),

    ],

    ),

    ),

    );

    }

    }

    2. Memuat tampilan yang berisi informasi profile kalian (foto, nama, nim, Alamat, nomor handphone, jurusan) dengan mengimplementasikan seluruh basic widget yang ada pada modul praktikum ini.

    import ‘package:flutter/material.dart’;

    void main() {

    runApp(const ProfileApp());

    }

    class ProfileApp extends StatelessWidget {

    const ProfileApp({super.key});

    @override

    Widget build(BuildContext context) {

    return const MaterialApp(

    debugShowCheckedModeBanner: false,

    home: ProfilePage(),

    );

    }

    }

    class ProfilePage extends StatelessWidget {

    const ProfilePage({super.key});

    @override

    Widget build(BuildContext context) {

    return Scaffold(

    appBar: AppBar(

    title: const Text(“Profil Mahasiswa”),

    backgroundColor: const Color.fromARGB(150, 58, 146, 137),

    centerTitle: true,

    ),

    body: Row(

    children: [

    Expanded(

    flex: 1,

    child: Center(

    child: CircleAvatar(

    radius: 80,

    backgroundColor: Colors.teal,

    child: ClipOval(

    child: Image.asset(

    “assets/images/kae.jpg”,

    fit: BoxFit.cover,

    width: 300,

    height: 300,

    ),

    ),

    ),

    ),

    ),

    Container(

    width: 1,

    height: double.infinity,

    color: const Color.fromARGB(255, 173, 167, 167),

    ),

    Expanded(

    flex: 2,

    child: Padding(

    padding: const EdgeInsets.all(16),

    child: Column(

    mainAxisAlignment: MainAxisAlignment.center,

    children: [

    Container(

    width: double.infinity,

    padding: const EdgeInsets.all(16),

    decoration: BoxDecoration(

    color: const Color.fromARGB(255, 255, 223, 238),

    borderRadius: BorderRadius.circular(12),

    border: Border.all(

    color: const Color.fromARGB(255, 219, 81, 150),

    width: 2,

    ),

    ),

    child: const Column(

    crossAxisAlignment: CrossAxisAlignment.start,

    children: [

    Text(

    “Nama : Nia Ramadhani”,

    style: TextStyle(

    fontSize: 16, fontWeight: FontWeight.bold),

    ),

    SizedBox(height: 8),

    Text(“NIM : 2311531006”),

    SizedBox(height: 8),

    Text(“Jurusan : Informatika”),

    ],

    ),

    ),

    const SizedBox(height: 20),

    Container(

    width: double.infinity,

    padding: const EdgeInsets.all(16),

    decoration: BoxDecoration(

    color: Colors.green[50],

    borderRadius: BorderRadius.circular(12),

    border: Border.all(

    color: const Color.fromARGB(255, 33, 109, 92),

    width: 2,

    ),

    ),

    child: const Column(

    crossAxisAlignment: CrossAxisAlignment.start,

    children: [

    Text(“Alamat : Jakarta, Sumatera Barat”),

    SizedBox(height: 8),

    Text(“No HP : 0888-0760-8714”),

    ],

    ),

    ),

    ],

    ),

    ),

    ),

    ],

    ),

    bottomNavigationBar: Padding(

    padding: const EdgeInsets.all(20),

    child: Column(

    mainAxisSize: MainAxisSize.min,

    children: [

    Row(

    mainAxisAlignment: MainAxisAlignment.center,

    children: const [

    Icon(Icons.email,

    color: Color.fromARGB(255, 253, 146, 205), size: 28),

    SizedBox(width: 8),

    Text(“syadirakaela@gmail.com”),

    ],

    ),

    const SizedBox(height: 20),

    ElevatedButton.icon(

    onPressed: () {

    ScaffoldMessenger.of(context).showSnackBar(

    const SnackBar(content: Text(“Profil disimpan”)),

    );

    },

    icon: const Icon(Icons.save),

    label: const Text(“Simpan Profil”),

    ),

    ],

    ),

    ),

    );

    }

    }

    1. Pratikum 1

      Aplikasi Mobile

      Pendahuluan

      Perkembangan teknologi saat ini mendorong hadirnya berbagai bahasa pemrograman yang dirancang untuk memudahkan pengembangan aplikasi, baik berbasis web, desktop, maupun mobile. Salah satu bahasa pemrograman modern yang banyak digunakan adalah Dart, yang dikembangkan oleh Google dan menjadi dasar dari framework Flutter. Dart memiliki karakteristik client-optimized sehingga mampu menghasilkan performa yang tinggi, sintaks yang sederhana, serta mendukung paradigma Object Oriented Programming (OOP).

      Sebelum memulai pengembangan aplikasi menggunakan Dart, diperlukan tahapan awal berupa instalasi dan konfigurasi lingkungan pemrograman (setup environment). Tahapan ini meliputi pemasangan Dart SDK, pengaturan environment variable, serta penggunaan Visual Studio Code dengan ekstensi pendukung. Selain itu, pemahaman terhadap struktur proyek Dart menjadi penting agar proses pengembangan dapat berjalan lebih terorganisir.

      Dalam praktikum ini, dilakukan beberapa kegiatan seperti instalasi SDK Dart, konfigurasi path, pembuatan proyek pertama menggunakan perintah dart create, serta menjalankan program sederhana. Selanjutnya dipelajari pula dasar-dasar pemrograman Dart yang meliputi tipe data seperti List, Set, dan Map, penggunaan perulangan, hingga konsep OOP berupa class, object, dan inheritance.

      Dengan adanya praktikum ini, mahasiswa diharapkan mampu memahami proses setup environment, struktur dasar proyek Dart, serta konsep fundamental pemrograman Dart sebagai landasan untuk mengembangkan aplikasi mobile menggunakan Flutter pada tahap berikutnya.

      Langkah Pengerjaan:
      1. Download SDK Dart pada halaman Dart SDK archive . Kemudian buka path untuk mengatur agar dart dapat dijalankan, buka Edit the system Environment variable dan klik Environment Variables maka akan muncul tampilan seperti berikut
      2. Pilih Path → Edit dan tambahkan Path dari SDK Dart C:\dart-sdk (tempat menyimpan hasil install dart sebelumnya). Kemudian cek pada cmd apakah dart terseebut sudah terinstall atau belum Jika tampilan sudah seperti ini maka dart sudah siap untuk digunakan.
      3. Selanjutnya gunakan tools Visual Studio Code untuk mengolah data dengan menambahkan extentions Dart
      4. Selanjutnya, kembali ke cmd untuk membuat proyek dart tersebut. Pilih file tempat penyimpannya dan ketikkan dart create halo
      5. Untuk menjalankannya ketikkan cd halo dan dart run Dari hasil gambar tersebut bisa dilihat bahwa sudah keluar hasil Hello world: 42!
      6. Setelah berhasil membuat proyek pertama Dart dengan nama halo, buka VSCode kemudian buka proyek halo yang sudah dibuat dan tampilannya akan seperti ini terdapat beberapa struktur dari dart yaitu:
        • bin/ – Berisi file executable
        • lib/ – Berisi source code utama
        • test/ – Berisi file testing
        • pubspec.yaml – File konfigurasi project dan dependencies
      7. Selanjutnya masuk ke dasar-dasar pemograman dart. Untuk membuat dasar-dasar pemograman dart ini buat file pada bin. Kemudian tipe data yang digunakan yaitu: LIST:Kumpulan elemen yang diurutkan dan dapat memiliki elemen duplikat, mirip dengan array pada bahasa lain. SET:Kumpulan elemen unik (tidak ada duplikat) dan tidak berurutan. MAP:Kumpulan pasangan nilai kunci (key-value pair), di mana setiap kunci bersifat unik dan digunakan untuk mengakses nilainya. Dari tipe data tersebut bisa menggunakan dua perulangan yang digunakan untuk mengeksekusi blok kode berulang kali, yaitu: atau menggunakan ini
      8. Pada Pemrograman Berorientasi Objek (OOP) dalam Dart langkah yang dilakukan yaitu:
        • membuat class dan object
        • membuat inheritance

      esimpulan

      Dari praktikum ini dapat disimpulkan bahwa proses instalasi dan konfigurasi Dart SDK berhasil dilakukan dengan menambahkan path ke environment system sehingga dapat dijalankan melalui Command Prompt. Pembuatan proyek pertama dengan perintah dart create dan menjalankannya melalui dart run menunjukkan bahwa lingkungan pemrograman Dart sudah siap digunakan.

      Penggunaan Visual Studio Code dengan ekstensi Dart membantu dalam pengelolaan proyek dan penulisan kode. Praktikum juga memberikan pemahaman mengenai struktur proyek Dart (bin, lib, test, pubspec.yaml) serta dasar-dasar pemrograman Dart meliputi penggunaan tipe data List, Set, Map, perulangan, hingga konsep Pemrograman Berorientasi Objek (OOP) seperti class, object, dan inheritance.

      Secara keseluruhan, praktikum ini memberikan pemahaman dasar mengenai setup environment, struktur proyek, serta konsep pemrograman dasar hingga OOP pada bahasa Dart, sehingga dapat menjadi bekal untuk pengembangan aplikasi lebih lanjut dengan framework Flutter.

    2. Pratikum 10

      A.Pendahuluan

      Dalam pengembangan aplikasi berbasis database, hubungan antar entitas atau tabel menjadi aspek penting yang harus dirancang dengan baik. Relasi antar tabel tidak hanya mencerminkan struktur data yang logis, tetapi juga memungkinkan sistem untuk melakukan pengolahan data yang efisien dan terorganisir. Salah satu pendekatan yang banyak digunakan dalam framework PHP Laravel adalah Eloquent ORM (Object-Relational Mapping) yang menyediakan cara deklaratif dan intuitif dalam mendefinisikan relasi antar model.

      Salah satu contoh skema relasi yang umum ditemukan dalam sistem akademik adalah antara mahasiswa (Student), jurusan (Major), dan mata kuliah (Subject). Dalam konteks ini, terdapat beberapa bentuk relasi yang dapat diimplementasikan menggunakan fitur bawaan Laravel:

      1. Relasi Many-to-One (Student belongs to Major)
        Setiap mahasiswa hanya berasal dari satu jurusan, sehingga relasi ini bersifat many-to-one. Di Laravel, hal ini direpresentasikan dengan method belongsTo() pada model Student yang mengarah ke model Major.
      2. Relasi One-to-Many (Major has many Student)
        Sebaliknya, satu jurusan dapat memiliki banyak mahasiswa. Relasi ini didefinisikan di model Major menggunakan method hasMany() yang mengarah ke model Student.
      3. Relasi Many-to-Many (Student belongs to many Subject)
        Mahasiswa dapat mengambil banyak mata kuliah, dan satu mata kuliah dapat diikuti oleh banyak mahasiswa. Relasi ini bersifat many-to-many dan membutuhkan sebuah pivot table (tabel perantara), misalnya student_subject, yang menyimpan relasi antara mahasiswa dan mata kuliah. Dalam Laravel, ini diatur menggunakan method belongsToMany() pada model Student dan Subject.
      4. Relasi Many-to-Many (Subject belongs to many Student)
        Sebagai pasangan dari relasi sebelumnya, model Subject juga memiliki relasi many-to-many dengan model Student, menggunakan pivot table yang sama.

      Penerapan relasi-relasi ini dalam Laravel mempermudah proses pengolahan data seperti menampilkan daftar mahasiswa per jurusan, melihat mata kuliah yang diambil oleh mahasiswa, atau menampilkan semua mahasiswa yang mengikuti suatu mata kuliah. Dengan struktur relasi yang tepat, aplikasi menjadi lebih modular, mudah dirawat, dan sesuai dengan prinsip normalisasi database.

      B.Langkah Pengerjaan

      1.Bikin file baru dimigration dengan nama majors, student, subject, dan student_subject dengan menjalankan perintah php artisan make:migration creat_”nama”_table

      2. Setelah itu pada file majors table masukkan kode berikut

      3. Pada file table student, masukkan kode berikut

      4. Pada file table subject, masukkan kode berikut

      5. Pada file table student_subject, masukkan kode berikut

      6. Untuk melihat apakah table tadi sudah terbuat jalankan perintah php artisan migrate

      7. Selanjutnya membuat model majors, student, dan subject dengan menjalankan perintah berikut ini

      8.Pada file model majors, masukkan kode berikut

      9. Pada file model student, masukkan kode berikut

      10. Pada file model subject, masukkan kode berikut

      11.Selanjutnya membuat seeder majorseeder, studentseeder, dan subjectseeder dengan menjalankan perintah berikut ini

      12.Pada file model majorseeder, masukkan kode berikut

      13. Pada file model studentseeder, masukkan kode berikut

      14.Pada file model subjectseeder, masukkan kode berikut

      15. Kemudian lakukan update pada DatabaseSeeder dengan kode berikut ini

      16. Kemudian jalankan perintah php artisan db:seed untuk melihat nama database yang udah dibuat sebelumnya

      17. Kemudian untuk melihat tampilannya gunakan app.blade.php pada folder layouts dan masukkan kode berikut ini

      18.Dan buat tampilan index.blade.php dan masukkan kode berikut

    3. Pratikum 9

      A.Pendahuluan

      Dalam pengembangan aplikasi web modern, operasi dasar yang dikenal dengan istilah CRUD (Create, Read, Update, Delete) menjadi fondasi utama dalam pengelolaan data. CRUD merupakan serangkaian fungsi yang memungkinkan pengguna untuk membuat, melihat, memperbarui, dan menghapus data dalam sebuah sistem informasi. Implementasi dari konsep ini sangat penting dalam hampir seluruh aplikasi, mulai dari sistem manajemen konten hingga aplikasi e-commerce.

      Laravel, sebagai salah satu framework PHP paling populer, menyediakan berbagai kemudahan dalam membangun aplikasi web yang bersih, terstruktur, dan efisien. Salah satu fitur unggulannya adalah kemampuannya dalam menangani proses CRUD secara terintegrasi melalui berbagai komponen seperti routing, controller, model (Eloquent ORM), serta blade templating untuk tampilan. Dengan bantuan Artisan Command dan resource controller, proses pembuatan fungsi CRUD di Laravel menjadi lebih cepat dan terstandarisasi.

      Sementara itu, HTML (Hypertext Markup Language) berperan sebagai pondasi utama dalam membangun antarmuka pengguna (UI) pada aplikasi web. Melalui HTML, developer dapat membuat form input data, tabel tampilan, tombol aksi, dan berbagai elemen visual lainnya yang mendukung interaksi pengguna dengan aplikasi. Dalam konteks Laravel, HTML biasanya digunakan bersama Blade Template Engine untuk menghasilkan tampilan dinamis berdasarkan data yang diolah di backend.

      Dengan menggabungkan kemampuan Laravel dalam manajemen logika aplikasi dan data, serta HTML sebagai media presentasi dan interaksi, pengembangan fitur CRUD menjadi lebih terstruktur dan efisien. Praktikum ini bertujuan untuk mempraktikkan implementasi fitur CRUD secara lengkap pada Laravel, sekaligus memahami bagaimana HTML digunakan untuk membangun antarmuka yang user-friendly dalam proses tersebut.

      B.Langkah pengerjaan

      1.Untuk membuat fitur manajemen users, gunakan fungsi keseluruhan CRUD untuk membuat controller resource. Gunakan perintah:

      2.Tambahkan route pada file web.php.

      3. Ketika berhasil jika dilihat pemetaan route php artisan route:list menjadi seperti gambar berikut.

      4. Buka file pada bagian app/Http/Controllers/UserController lalu masukkan kode-kode fungsi CRUD berikut:

      5. Route untuk menampilkan view form tambah data users adalah users/create dengan membuka file UserController kemudian pada action create edit kode program menjadi seperti berikut.

      6.Perintah return view(‘user.create’) artinya menampilkan view create pada folder user. Selanjutnya buat folder user didalam folder view, kemudian tambahkan file create.blade.php dan isikan dengan kode program berikut ini.

      7.Selanjutnya tambahkan file css dan javascript select2 kedalam layout main.blade.php

      8.Kemudian edit pada bagian user/create.blade.php untuk membuat form inputan create user

      9. Jika berhasil maka tampilannya akan seperti dibawah ini

      10. Selanjutnya menambahkan action store pada UserController yang dimana Form create user menggunakan method POST yang akan dikirimkan ke action store dengan route users.store, selanjutnya pada action store akan ditangkap isi form create user dengan cara $request->get(‘nama input’). Kemudian disimpan pada table user dengan cara instance model User dengan $user = new \App\Models\User. Setelah itu assign sesuai dengan nama field. Untuk menyimpan kedalam database User, gunakan perintah $user->save. Jika data berhasil disimpan, maka akan di redirect ke route users.index dengan membawa session status, gunakan kode berikut

      11. Untuk menampilkan data user kita akan menggunakan method GET dengan menambahkan kode seperti dibawah ini pada bagian action index di UserController

      12. Untuk menampilkan tabel user maka buat file index.blade.php dan masukkan kode berikut ini

      13. Karena menggunakan datatables, tambahkan file css datatable pada bagian head main.blade.php

      14.Untuk mengaktifkan botton edit dan melakukan proses update data user terlebih dahulu membuatkan tombol action yang mengarahkan pada route users/edit/{user}/edit atau action edit pada UserController untuk menampilkan form dan menggunakan route users/edit/{user} untuk method PUT.

      15.Dan untuk menjalakan edit, buat file baru di folder user dengan nama edit.blade.php. Masukkan kode berikut ini

      16.Pada saat diuji tampilan edit akan seperti ini, dimana sebelumnya bernama fulan kemudian diedit menjadi new admin

      17. Untuk menyimpan perubahan data kita perlu action update yang ditambahkan pada UserController dengan kode berikut

      18.Dan setelah ditekan simpan tampilannya akan berubah dengan nama yang sudah diedit

      19.Selanjutnya untuk mengaktifkan button hapus, tambahkan tombol atau link pada list user dan tambahkan kdoe berikut pada index.blade.php yang diletakkan dibawah link edit

      20.Pada UserController tambah kode berikut untuk mengaktifkan action destroy

      21.Untuk menguji nya klik salah satu data yang ada dan klik tombol hapus

      22. Setelah berhasil maka data tersebut sudah terhapus

      23.Untuk menambahkan menu user tambahkan kode berikut pada file sidebar.blade.php dalam folder layout

      24.Tampilan akhir

    4. Tugas API Laravel

      A. Pendahuluan

      API (Application Programming Interface) adalah sekumpulan aturan dan protokol yang memungkinkan berbagai aplikasi perangkat lunak untuk berkomunikasi satu sama lain. Anggap saja API sebagai “pelayan” atau “jembatan” di dunia digital. Saat Anda menggunakan sebuah aplikasi, misalnya memesan ojek online, aplikasi tersebut perlu mengakses data dari aplikasi lain, seperti peta untuk navigasi. API inilah yang memungkinkan permintaan data (seperti lokasi Anda) dikirim ke server penyedia peta dan kemudian menerima respons (berupa tampilan peta) untuk ditampilkan di aplikasi ojek online Anda. Anda sebagai pengguna tidak perlu tahu kerumitan proses di baliknya; API menangani semuanya di belakang layar.

      Fungsi utama API adalah untuk mengintegrasikan dan memfasilitasi pertukaran data antar platform atau aplikasi yang berbeda tanpa harus mengetahui cara kerja internal masing-masing. Dengan adanya API, pengembang tidak perlu membangun setiap fitur dari nol. Mereka dapat memanfaatkan fungsionalitas yang sudah ada dari aplikasi lain. Contohnya, pengembang aplikasi e-commerce dapat menggunakan API dari sistem pembayaran untuk memproses transaksi, sehingga mereka tidak perlu repot membuat sistem pembayaran sendiri. Hal ini mempercepat proses pengembangan, meningkatkan efisiensi, dan memungkinkan terciptanya aplikasi yang lebih kaya fitur dengan menghubungkan berbagai layanan menjadi satu kesatuan yang utuh.

      Untuk lebih jelasnya, coba lihat gambar berikut:

      Komponen-komponen API adalah seperti berikut:

      1. Request (Permintaan)
        • URL/Endpoint
        • HTTP Method
        • Headers
        • Body/Payload
      2. Response (Respons)
        • Status Code
        • Headers
        • Body/Data

      Berikut ini merupakan ilustrasi komponen utama API

      RESTful API adalah sebuah API yang dirancang mengikuti gaya arsitektur REST (Representational State Transfer), yang saat ini menjadi standar paling populer untuk membangun layanan web. Ini bukanlah sebuah protokol yang kaku, melainkan serangkaian prinsip dan panduan desain. Dalam konsep REST, semua informasi dianggap sebagai “sumber daya” (resource), misalnya data pengguna atau detail produk, yang dapat diakses melalui URL unik. Untuk memanipulasi sumber daya ini, RESTful API memanfaatkan metode standar HTTP yang sudah ada: GET untuk mengambil data, POST untuk membuat data baru, PUT/PATCH untuk memperbarui data yang sudah ada, dan DELETE untuk menghapusnya. Salah satu ciri utamanya adalah bersifat stateless (tanpa status), yang berarti setiap permintaan dari client harus berisi semua informasi yang dibutuhkan server untuk memprosesnya, karena server tidak menyimpan informasi sesi dari permintaan sebelumnya. Pendekatan ini membuat API menjadi lebih sederhana, andal, dan mudah untuk diskalakan.

      B. Langkah-Langkah

      Pada tutorial ini, kita akan membuat sebuah API di project laravel. Tutorial ini akan membuat project baru laravel agar dapat mudah dipahami dari awal hingga akhir. API yang dibuat akan berfungsi sebagai CRUD sederhana dengan database SQLite.

      Pertama-tama, buatlah sebuah project laravel terlebih dahulu menggunakan Laravel Installer atau composer.

      Setelah menginstall project laravel, kita akan membuat migrasi data. Masukkan kode berikut di terminal:

      Setelah dijalankan, masukkan kode berikut ke file migrasi yang telah dibuat. Letaknya di database/migration:

      Setelah dimasukkan, lakukan migrasi dengan memasukkan kode berikut di terminal:

      Jika sudah, maka akan seperti berikut:

      Setelah itu, kita akan membuat model berdasarkan migrasi yang telah kita buat. Caranya dengan memasukkan kode berikut di terminal:

      Lalu, masukkan kode berikut di model Product yang yang telah dibuat:

      Setelah membuat model dan migrasi, maka kita akan bangun API nya. Pertama, buat Route API nya dengan cara memasukkan kode berikut:

      Kemudian, masukkan kode berikut di routes/api.php

      Kedua, kita akan membuat ProductController. Caranya dengan memasukkan kode berikut:

      Setelah itu, masukkan kode berikut ke controller:

      Kemudian, kita akan membuat API Resource. Fitur yang memungkinkan untuk mentransformasi model data atau collection menjadi format JSON yang konsisten dan mudah dikustomisasi untuk API response. API Resource berfungsi sebagai layer transformasi antara model Eloquent dan JSON response yang dikirim ke client sehingga dapat digunakan untuk Mengontrol format output JSON, Menyembunyikan field sensitive, Menambahkan field computed dan Membuat response yang konsisten.

      Buat API Resouce dengan memasukkan kode berikut:

      Kemudian, masukkan kode berikut di file ProductResource:

      Untuk menggunakan resource yang telah dibuat, tambahkan kode berikut di index() controller dan show() controller:

      Selanjutnya, kita akan membuat validasi dan error handling. Pertama, kita akan membuat Form Request Validation. Gunakan kode berikut di terminal:

      Kemudian, masukkan kode berikut:

      Lalu, tambahkan kode berikut di app/Exceptions/Handler.php untuk menangani Exception:

      Langkah selanjutnya yaitu mencoba menggunakan api yang telah kita buat. Caranya yaitu menggunakan aplikasi Postman. Aplikasi Postman dapat diunduh disini. Install aplikasi sesuai instruksi.

      Kemudian, buka web server dari laravel menggunakan kode berikut:

      Selanjutnya, buka aplikasi Postman. Tampilan awal akan seperti ini:

      1. Memanggil semua data

      URL: http://127.0.0.1:8000/api/

      products

      Method: Get

      Hasilnya adalah sebagai berikut:

      2. Menambahkan produk

      URL: http://127.0.0.1:8000/api/

      Method: POST

      Contoh datanya adalah seperti berikut. Masukkan di body dengan format JSON:

      { 
      "name": "IPHONE 18", 
      "description": "IPHONE 18 Terbaru", 
      "price": 123000000.00, 
      "stock": 25 
      }

      Klik send dan hasilnya akan seperti berikut:

      Jika kita masukkan kolom yang salah atau data yang salah, maka hasilnya seperti berikut:

      Untuk menampilkan exception seperti digambar, tambahkan kode berikut di fungsi store() di controller:

      3. Mencari data berdasarkan ID
      URL: http://127.0.0.1:8000/api/products/1

      Method: GET

      Hasilnya adalah sebagai berikut:

      Jika ID tidak ada di database, maka akan seperti berikut:

      Untuk menampilkan exception seperti diatas, tambahkan kode berikut di fungsi show() di controller:

      4. Mengupdate Data

      URL: http://127.0.0.1:8000/api/products/1

      Method: PUT

      Hasilnya adalah sebagai berikut:

      5. Menghapus data

      URL: http://127.0.0.1:8000/api/products/1

      Method: DELETE

      Hasilnya adalah sebagai berikut:

      Link Github: https://github.com/NiaRamadhani31/Laravel-api

    5. Pratikum 8

      PENDAHULUAN

      Seiring berkembangnya teknologi informasi, kebutuhan akan sistem informasi yang handal, efisien, dan mudah dikembangkan menjadi semakin penting, terutama dalam lingkungan akademik, pemerintahan, maupun sektor industri. Salah satu teknologi yang banyak digunakan dalam membangun sistem informasi modern adalah Laravel, yaitu sebuah framework PHP yang bersifat open source dan berbasis arsitektur Model-View-Controller (MVC). Laravel dikenal dengan sintaks yang elegan, dokumentasi yang lengkap, serta kemudahan dalam pengelolaan proyek pengembangan web berskala kecil hingga besar.

      Dalam konteks pengembangan sistem informasi, Laravel sering menjadi pilihan utama karena berbagai fitur unggulan yang dimilikinya. Beberapa fitur penting tersebut antara lain adalah sistem routing yang fleksibel, ORM (Eloquent) untuk manajemen basis data, Blade sebagai templating engine yang efisien, serta integrasi yang mudah dengan berbagai pustaka pihak ketiga. Laravel juga menyediakan fitur built-in seperti autentikasi, middleware, validasi data, dan manajemen sesi, yang semuanya membantu mempercepat proses pengembangan tanpa mengorbankan keamanan dan performa aplikasi.

      Salah satu implementasi Laravel yang sangat bermanfaat dalam dunia pendidikan atau manajemen organisasi adalah Laravel Sisfo (Sistem Informasi). Laravel Sisfo merupakan proyek sistem informasi berbasis Laravel yang didesain untuk memenuhi kebutuhan pengelolaan data secara digital, baik dalam lingkup institusi pendidikan, organisasi pemerintahan, hingga perusahaan swasta. Dengan Laravel Sisfo, pengguna dapat membangun aplikasi web yang mendukung proses CRUD (Create, Read, Update, Delete), autentikasi multi-level user (admin, user, guest, dll), manajemen data pengguna, serta tampilan dashboard interaktif yang profesional.

      Penggunaan Laravel dalam sistem informasi memberikan banyak keuntungan, di antaranya adalah struktur proyek yang rapi dan terorganisir, kemudahan dalam kolaborasi tim, serta kemudahan dalam deployment aplikasi ke server produksi. Selain itu, Laravel terus diperbarui secara berkala oleh komunitas pengembang di seluruh dunia, sehingga framework ini tetap relevan dan aman digunakan dalam jangka panjang.

      Praktikum ini bertujuan untuk memberikan pemahaman praktis kepada mahasiswa mengenai proses pembangunan sistem informasi menggunakan Laravel, dimulai dari instalasi dan konfigurasi awal, pembuatan database dan migrasi, penerapan autentikasi pengguna, hingga pengembangan tampilan antarmuka menggunakan template profesional seperti SB Admin 2. Dalam praktikum ini, mahasiswa juga akan belajar bagaimana menerapkan konsep multi-level user untuk mengatur hak akses berdasarkan peran (role) pengguna, serta bagaimana menggunakan fitur seeding dan migration dalam mengelola data awal secara otomatis.

      Dengan mempelajari dan menerapkan Laravel Sisfo secara langsung, diharapkan mahasiswa dapat memperoleh pengalaman nyata dalam membangun sistem informasi yang tidak hanya fungsional namun juga mengikuti standar industri. Hal ini menjadi bekal penting dalam menghadapi tantangan dunia kerja yang semakin kompetitif dan berbasis teknologi.

      Langkah pengerjaan:


      Buat folder dengan nama laravel untuk menyimpan project laravel sisfo

      Setelah itu masuk ke cmder untuk membuat project laravel dengan nama laravel-sisfo

      Buat konfigurasi database

      Lakukan user authentication dengan fitur bawaan Laravel, dimana fitur ini akan mengenerate controller, model, view, dan route authentication secara otomatis dan akan menampilkan view yang sudah menggunakan framework Bootstrap sehingga memudahkan dalam membuat fitur authentication pada aplikasi.
      Masukkan perintah: composer require laravel/ui

      Masukkan perintah berikut pada cmder untuk menginstall dan compile file-file asset bawaan: npm install && npm run dev Jika sudah maka secara otomatis file-file akan terbuat

      Masukkan perintah berikut untuk membuat migration table authentication: php artisan migrate

      Masukkan perintah berikut untuk mendapatkan URL untuk mengakses halaman login dan register: php artisan serve Maka tampilannya akan seperti ini:

      Login

      Register

      Masukkan perintah berikut pada terminal atau cmder untuk menambahkan beberapa field (username, level, status): php artisan make:migration costum_table_users

      Untuk menguji apakah sudah berhasil atau belum: php artisan migrate

      Selanjutnya membuat user dengan fitur seeding pada laravel dengan memasukkan perintah

      bashSalinEditphp artisan make:seeder AdminSeeder
      

      maka folder akan terbuat secara otomatis. Masukkan kode program seperti dibawah ini pada file tersebut.Sebagai contoh gunakan view home.blade.php, buka file tersebut dan isikan dengan kode program berikut

      Untuk menguji sudah berhasil atau belum masukkan perintah dibawah ini pada terminal


      Jika sudah berhasil menambahkan user maka dapat login ke aplikasi menggunakan akun tersebut, maka tampilan login akan seperti ini


      Selanjutnya konfigurasi tampilan aplikasi sesuai dengan template yang dipilih, pada saat ini akan menggunakan template SB Admin 2 dengan framework Bootstrap


      Buka file app.blade.php pada folder layout sebelumnya dan masukkan kode program dibawah ini

      Setelah memasukkan kode program tersebut maka tampilan halaman login akan seperti ini


      Selanjutnya membuat layout baru dengan nama main.blade.php pada folder layout tadi yang digunakan untuk membuat layout global yang nantinya akan digunakan sebagai layout utama aplikasi dan view-view lain akan mengambil resource di sini. Masukkan kode program seperti dibawah ini

      Pada layouts/main.blade.php sebelumnya akan memanggil view sidebar.blade.php dan view topbar.blade.php ke dalam layout main.blade.php dengan menggunakan perintah @include sehingga tampilan kedua view tersebut akan tampil pada layout main.


      Selanjutnya juga akan menampilkan data judul dan konten dari view yang akan menggunakan layouts/main.blade.php dengan perintah @yield('judul') dan @yield('konten'). Maka buat file sidebar.blade.php pada folder layout dan masukkan kode program berikut ini


      Sebagai contoh gunakan view home.blade.php, buka file tersebut dan isikan dengan kode program berikut.

      Buat file topbar.blade.php pada folder layout dan masukkan kode program berikut ini


      Kesimpulan

      Berdasarkan hasil praktikum dan implementasi sistem menggunakan Laravel Sisfo, dapat disimpulkan bahwa Laravel merupakan framework PHP yang sangat powerful dan efisien untuk membangun aplikasi web berbasis sistem informasi. Dengan pendekatan arsitektur MVC (Model-View-Controller) dan fitur-fitur bawaan seperti autentikasi, routing, database migration, seeding, serta Blade templating engine, Laravel mampu mempercepat proses pengembangan aplikasi sekaligus menjaga kualitas dan struktur kode yang rapi.

      Melalui praktikum ini, mahasiswa telah mempelajari langkah-langkah penting dalam membangun sistem informasi mulai dari instalasi Laravel, pembuatan dan konfigurasi database, penggunaan fitur autentikasi multi-level user, hingga implementasi template antarmuka modern seperti SB Admin 2. Selain itu, mahasiswa juga memahami pentingnya pengelolaan layout global melalui main.blade.php, serta bagaimana menyusun tampilan yang dinamis dan konsisten melalui include view seperti sidebar.blade.php, topbar.blade.php, dan home.blade.php.

      Penggunaan Laravel dalam pengembangan sistem informasi tidak hanya memberikan kemudahan dari sisi teknis, tetapi juga memberikan wawasan kepada mahasiswa mengenai praktik terbaik dalam membangun aplikasi yang scalable, maintainable, dan aman. Dengan demikian, Laravel Sisfo dapat menjadi solusi yang tepat dalam membangun sistem informasi modern yang profesional dan siap digunakan dalam berbagai konteks organisasi maupun institusi.

    6. Pratikum 7

      Pendahuluan

      Perkembangan teknologi informasi yang pesat telah mendorong transformasi digital di berbagai sektor, termasuk pendidikan, bisnis, pemerintahan, dan layanan publik. Salah satu aspek penting dalam transformasi ini adalah pengembangan aplikasi web yang andal, cepat, dan mudah digunakan. Dalam dunia pengembangan web modern, pemilihan framework yang tepat menjadi faktor kunci untuk memastikan efisiensi dan efektivitas dalam membangun sistem informasi yang kompleks dan skalabel. Salah satu framework yang menonjol dalam ekosistem pengembangan web berbasis PHP adalah Laravel.

      Laravel adalah framework open-source yang dibangun menggunakan bahasa pemrograman PHP dan mengikuti arsitektur Model-View-Controller (MVC). Framework ini pertama kali dikembangkan oleh Taylor Otwell pada tahun 2011 sebagai jawaban atas keterbatasan framework PHP lain yang ada pada saat itu, seperti CodeIgniter. Sejak saat itu, Laravel terus berkembang dan menjadi salah satu framework PHP yang paling banyak digunakan oleh komunitas pengembang di seluruh dunia karena kemudahan penggunaannya, dokumentasi yang lengkap, dan komunitas yang aktif.

      Keunggulan Laravel terletak pada sintaksnya yang bersih dan ekspresif, yang dirancang untuk meningkatkan produktivitas pengembang tanpa mengorbankan fleksibilitas dan skalabilitas. Laravel menyediakan banyak fitur unggulan seperti Routing yang efisien, Eloquent ORM (Object Relational Mapping) untuk interaksi dengan basis data, Blade templating engine untuk mengelola tampilan antarmuka, serta sistem autentikasi dan otorisasi yang kuat. Selain itu, Laravel dilengkapi dengan Artisan CLI (Command Line Interface) yang memungkinkan pengembang untuk menjalankan berbagai perintah secara otomatis, seperti membuat controller, model, migrasi database, hingga testing.

      Laravel juga mendukung pengembangan aplikasi berbasis REST API, middleware untuk pengelolaan request, validasi form, session management, hingga fitur keamanan seperti CSRF protection dan hashing password. Semua fitur ini dirancang untuk memberikan pengalaman pengembangan yang lebih terstruktur, aman, dan efisien.

      Dalam praktiknya, Laravel telah banyak digunakan untuk membangun berbagai jenis aplikasi web, mulai dari sistem informasi akademik, e-commerce, layanan pemesanan online, sistem manajemen kepegawaian, hingga aplikasi berbasis SaaS (Software as a Service). Kemampuannya dalam menangani proyek kecil hingga besar menjadikan Laravel pilihan tepat bagi pengembang pemula hingga profesional.

      Oleh karena itu, dengan memanfaatkan Laravel sebagai kerangka kerja utama dalam pengembangan aplikasi web, pengembang dapat mempercepat proses pembuatan aplikasi, meningkatkan kualitas kode, serta mengurangi potensi error dan bug. Laravel tidak hanya sekadar framework, tetapi merupakan sebuah ekosistem lengkap yang mendukung seluruh siklus hidup pengembangan perangkat lunak, mulai dari tahap perancangan, pengkodean, pengujian, hingga deployment.

      Tujuan Praktikum

      Tujuan praktikum ini yaitu mampu installasi Laravel, membuat project baru Laravel, mengenal struktur Laravel, konsep MVC laravel.

      Langkah – Langkah Pengerjaan

      Install aplikasi yang dibutuhkan

      • Web server (menggunakan Apache dari XAMPP)
      • Database (menggunakan MySQL dari XAMPP)
      • Composer
      • Cmder (untuk memudahkan melakukan command di terminal)
      • Node.js dan npm
      • GIt

      Selain itu, persyaratan untuk menggunakan Laravel 12 Adalah sebagai berikut:

      • PHP >= 8.2
      • Ctype PHP Extension
      • cURL PHP Extension
      • DOM PHP Extension
      • Fileinfo PHP Extension
      • Filter PHP Extension
      • Hash PHP Extension
      • Mbstring PHP Extension
      • OpenSSL PHP Extension
      • PCRE PHP Extension
      • PDO PHP Extension
      • Session PHP Extension
      • Tokenizer PHP Extension
      • XML PHP Extension

      Pertama, install aplikasi XAMPP di https://www.apachefriends.org/index.html. Disini kita menggunakan cmd untuk mengecek berbagai hal seperti yang akan kita lakukan selanjutnya. Jika sudah terinstall, kita bisa mengecek PHP yang sudah terinstall dari XAMPP dengan command:

      Kemudian, install Composer di https://getcomposer.org/Composer-Setup.exe. Composer merupakan package manager untuk PHP, composer akan digunakan untuk menambahkan package-package yang dibutuhkan pada saat development. Install sesuai ketentuan langkah wizard setup yang diberikan. Setelah instalasi, kita bisa mengecek Composer yang telah terinstall dengan command:

      Setelah itu, install Git di https://git-scm.com/downloads/win. Install sesuai ketentuan langkah wizard setup yang diberikan. Setelah instalasi, kita bisa mengecek Git yang telah terinstall dengan command:

      Kemudian, install node.js dan npm di https://nodejs.org/. Node JS pada Laravel berfungsi untuk menangani masalah frontedn dan build asset UI (Library UI). Install sesuai ketentuan langkah wizard setup yang diberikan. Setelah instalasi, kita bisa mengecek Git yang telah terinstall dengan command:

      Setelah melakukan instalasi, kita perlu mengecek apakah spesifikasi sistem kita sesuai dengan ketentuan laravel. Gunakan file berikut untuk mengecek spesifikasi dan letakkan di folder project. Anda bisa mendownload file tersebut disini

      Pastikan setelah menjalankan file, akan berbentuk seperti berikut:

      Selanjutnya, kita akan membuat project Laravel. Ada beberapa cara untuk membuat project Laravel yaitu kita menggunakan installer atau menggunakan composer.

      LAPORAN PRAKTIKUM 7

      • Laravel Installer

      Dowload installer Laravel menggunakan composer, caranya ketik perintah berikut pada terminal (cmder):

      composer global require laravel/installer

      Kemudian, buat project baru dengan perintah:

      laravel new example-app
      • Composer

      Buat project Laravel menggunakan perintah berikut.

      composer create-project laravel/laravel=^[versi] nama_project --prefer-dist

      Pada praktikum kali ini, kita akan menggunakan Laravel Installer. Install Laravel Installer dengan menggunakan command Laravel Installer seperti diatas. Hasilnya akan seperti ini.

      hasilnya telah terinstal laravel

      selanjutnya buka vscode dan tampilkan file dari laravel tersebut. Untuk menjalankan project Laravel yang telah dibuat, gunakan perintah php artisan serve

      untuk menampilkan output “Hello World”

      Route : get('/helo', function() {
             return "Hello Word";
      });

      lalu ketikan code diatas ke dalam vscode seperti berikut, pada web.php

      lalu ketikan pada terminal yang ada dibagian bawah dengan code seperti ini:

      klik link http://127.0.0.1.8000 dan tambahkan helo pada link tersebut untuk menghasilkan output “Hello World”

      Penutup

      a.kesimpulan

      Laravel merupakan framework PHP yang sangat powerful dan efisien dalam membantu proses pengembangan aplikasi web modern. Dengan mengikuti arsitektur Model-View-Controller (MVC), Laravel memisahkan logika bisnis, tampilan antarmuka, dan pengelolaan data secara sistematis sehingga kode menjadi lebih terstruktur, mudah dibaca, dan dikelola.

      Dalam praktik koding, Laravel menyediakan berbagai fitur penting yang mempercepat proses pembuatan aplikasi, seperti:

      • Routing yang sederhana dan fleksibel,
      • Eloquent ORM yang memudahkan interaksi dengan database,
      • Blade template engine untuk tampilan HTML yang dinamis,
      • Serta dukungan middleware, form validation, dan autentikasi pengguna.

      Melalui fitur Artisan CLI, pengembang juga dapat menghasilkan kode boilerplate secara otomatis, sehingga pekerjaan menjadi lebih efisien dan konsisten. Selain itu, Laravel mendukung testing unit, sehingga aplikasi dapat diuji secara menyeluruh untuk memastikan kualitasnya.

      Secara keseluruhan, penggunaan Laravel dalam pengembangan aplikasi web memberikan pengalaman coding yang bersih, efisien, dan scalable. Laravel tidak hanya mempercepat waktu pengembangan, tetapi juga meningkatkan kualitas dan keamanan aplikasi.

    7. Laporan 1

      Laporan praktikum web pertemuan 6

      LAPORAN PRAKTIKUM

      #OOP PHP & MySQL – CRUD Sederhana

      GitHub cllick

      1. Tujuan

      Tujuan praktikum ini : mahasiswa mampu mengimplementasikan konsep Object Oriented Programming pada PHP dengan membuat aplikasi CRUD Sederhana.

      2. Konsep OOP

      a. Destructor − refers to a special type of function which will be called automatically whenever an object is deleted or goes out of scope.

      b. Class – a template for making many instances of the same kind (or class) of object.

      c. Object − individual instance of the data structure defined by a class.

      d. Member Variable − These are the variables defined inside a class. This data will be invisible to the outside of the class and can be accessed via member functions. These variables are called attribute of the object once an object is created.

      4. Member Function − These are the function defined inside a class and are used to access object data.

      e. Inheritance − When a class is defined by inheriting existing function of a parent class then it is called inheritance. Here child class will inherit all or few member functions and variables of a parent class.

      f. Parent Class − A class that is inherited from by another class. This is also called a base class or super class.

      g. Child Class − A class that inherits from another class. This is also called a subclass or derived class.

      h. Polymorphism − Same function can be used for different purposes.

      i. Overloading − a type of polymorphism in which some or all of operators have different implementations depending on the types of their arguments. Similarly functions can also be overloaded with different implementation.

      j. Data Abstraction − Any representation of data in which the implementation details are hidden (abstracted).

      k. Encapsulation − refers to a concept where we encapsulate all the data and member functions together to form an object.

      l. Constructor − refers to a special type of function which will be called automatically whenever there is an object formation from a class.

      Langkah- Langkah Pengerjaan

      1. Buat folder baru didalam folder htdocs, kemudian buka menggunakan VS Code dan buat struktur file atau direktori seperti gambar berikut ini.

      2. Koneksi ke database

      a. Pertama-tama buat database baru dengan nama pemrograman_web, kemudian buat table mahasiswa sebagai berikut.

      CREATE TABLE mahasiswa (
      id int(11) NOT NULL,
      nim varchar(16) NOT NULL,
      nama varchar(128) NOT NULL,
      jurusan varchar(128) NOT NULL
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

      b. Selanjutnya membuat koneksi ke database, buka file config/Database.php dan ketikan kode program Berkut ini.

      <?php
      class Database {
          private $host = "localhost";
          private $db_name = "pemrograman_web";
          private $username = "root";
          private $password = "";
          public $conn;
      
          public function getConnection() {
              $this->conn = null;
              try {
                  $this->conn = new mysqli($this->host, $this->username, $this->password, $this->db_name);
              } catch (Exception $e) {
                  echo "Connection error: " . $e->getMessage();
              }
              return $this->conn;
          }
      }
      ?>

      c. File Config.php

      File Config.php digunakan untuk membuat variable constant yang mana nantinya dapat diakases dari kelas manapun, pada praktikum ini akan membuat variable constant dengan nama BASE_URL yang berisi string base url dari project yang akan dibuat.

      D. Alert.php

      Alert.php digunakan untuk membuat sebuah function yang berfungsi untuk menampilkan pesan Ketika melakukan operasi terhadap data, fungsi ini memiliki 2 buah argument statement yaitu $msg yang berisi pesan dan $sts yang berisi kode jika status 1 maka pesan berhasil dan jika 0 maka pesan gagal. Berikut kode program fungsi alert.

      <?php
      function alert($msg, $sts) {
          if($sts == 1) {
              $tipe = 'success';
          } else {
              $tipe = 'danger';
          }
      
          echo '
              <div class="alert alert-'.$tipe.'" role="alert">'.$msg.'
              </div>
          ';
      }

      E. Model Mahasiswa

      Class Mahasiswa digunakan untuk membuat fungsi operasi Create, Read, Update dan Delete data Mahasiswa, berikut ini Langkah-langkah pembuatan class Mahasiswa.

      1. Tambahkan session_start() pada baris paling atas kode program

      2. Buat class dengan nama Mahasiswa

      3. Deklarasikan variabel yang dibutuhkan dan fungsi constructor yang memanggil koneksi database

      <?php
      session_start();
      class Mahasiswa {
      private $conn;
      private $table_name = “mahasiswa”;

      public $id;
      public $nim;
      public $nama;
      public $jurusan;

      public function __construct($db) {
      $this->conn = $db;
      }

      4. Buat fungsi create yang nantinya digunakan untuk menambahkan data mahasiswa

          public function create() {
              $query = "INSERT INTO " . $this->table_name . " SET nim=?, nama=?, jurusan=?";
              $stmt = $this->conn->prepare($query);
              $stmt->bind_param("sss", $this->nim, $this->nama, $this->jurusan);
              if ($stmt->execute()) {
                  $_SESSION['flash_message'] = "Data berhasil disimpan!";
                  header("Location: " . BASE_URL . "index.php?msg=1");
              } else {
                  $_SESSION['flash_message'] = "Data gagal disimpan!";
                  header("Location: " . BASE_URL . "index.php?msg=0");
              }
          }

      5. Buat fungsi read untuk menampilkan data mahasiswa, fungsi read memiliki default parameter $id yang berisi string kosong, jika $id == “” maka akan mengeksekusi query untuk menampilkan seluruh data mahasiswa, jika $id !== “” maka akan mengeksekusi query untuk menampilkan data mahasiswa berdasarkan id mahasiswa. Berikut kode program fungsi read.

        public function read($id="") {
              if ($id == "") {
                  $query = "SELECT * FROM " . $this->table_name;
              } else {
                  $query = "SELECT * FROM " . $this->table_name . " WHERE id= " . $id;
              }
              $result = $this->conn->query($query);
              return $result;
          }

      6. Buat fungsi update untuk melakukan perubahan data mahasiswa berdasarkan ID mahasiswa

       public function update() {
              $query = "UPDATE " . $this->table_name . " SET nim=?, nama=?, jurusan=? WHERE id=?";
              $stmt = $this->conn->prepare($query);
              $stmt->bind_param("ssss", $this->nim, $this->nama, $this->jurusan, $this->id);
              if ($stmt->execute()) {
                  $_SESSION['flash_message'] = "Data berhasil diupdate!";
                  header("Location: " . BASE_URL . "index.php?msg=1");
              } else {
                  $_SESSION['flash_message'] = "Data gagal diupdate!";
                  header("Location: " . BASE_URL . "index.php?msg=0");
              }
          }

      7. Buat fungsi delete untuk menghapus data mahasiswa berdasarkan ID

          public function delete() {
              $query = "DELETE FROM " . $this->table_name . " WHERE id=?";
              $stmt = $this->conn->prepare($query);
              $stmt->bind_param("s", $this->id);
              if ($stmt->execute()) {
                  $_SESSION['flash_message'] = "Data berhasil dihapus!";
                  header("Location: " . BASE_URL . "index.php?msg=1");
              } else {
                  $_SESSION['flash_message'] = "Data gagal disimpan!";
                  header("Location: " . BASE_URL . "index.php?msg=0");
              }
          }
      }
      ?>
      F. Fungsi Mahasiswa

      Fungsi mahasiswa ini berfungsi sebagai controller yang menghubungkan antara class/model mahasiswa dengan view, buka file function/Mahasiswa.php, kemudian tambahkan kode program berikut

      <?php
      include_once '../config/Database.php';
      include '../config/Config.php';
      include_once '../model/Mahasiswa.php';
      
      $database = new Database();
      $db = $database->getConnection();
      $mahasiswa = new Mahasiswa($db);
      
      if (isset($_GET['action'])) {
          if ($_GET['action'] == 'create') {
              $mahasiswa->nim = $_POST['nim'];
              $mahasiswa->nama = $_POST['nama'];
              $mahasiswa->jurusan = $_POST['jurusan'];
              $mahasiswa->create();
          } elseif ($_GET['action'] == 'delete') {
              $mahasiswa->id = $_GET['id'];
              $mahasiswa->delete();
          } elseif ($_GET['action'] == 'update') {
              $mahasiswa->id = $_POST['id'];
              $mahasiswa->nim = $_POST['nim'];
              $mahasiswa->nama = $_POST['nama'];
              $mahasiswa->jurusan = $_POST['jurusan'];
              $mahasiswa->update();
          }
      }
      ?>

      Pertama akan dilakukan pengecekan sebuah parameter action yang dikirimkan melalui method GET, jika ada terdapat parameter action yang dikirimkan maka nilai parameter akan diambil dan digunakan sesuai dengan fungsinya, ada 3 buah isi parameter yang dikirimkan yaitu create, delete dan update.

      G. View

      View ini berfungsi untuk menampilkan data, menampilkan form input dan update data mahasiswa.

      index.php

      File Index.php ini berisi tampilan data-data mahasiswa yang telah berhasil diinputkan kedalam database, berikut ini kode program Index.php

      <?php
      include 'function/Alert.php'; 
      include_once './config/Database.php'; 
      include_once './model/Mahasiswa.php';
      
      $database = new Database();
      $db = $database->getConnection();
      $mahasiswa = new Mahasiswa($db);
      $result = $mahasiswa->read();
      ?>
      
      <!doctype html>
      <html lang="en">
          <head>
              <meta charset="utf-8">
              <meta name="viewport" content="width=device-width, initial-scale=1">
              <title>OOP - CRUD</title>
              <link href="assets/css/bootstrap.min.css" rel="stylesheet">
          </head>
          <body>
              <div class="container">
                  <div class="row">
                      <div class="col-lg-12">
                          <h4 class="text-center">Data Mahasiswa</h4>
                          <a class="btn btn-primary btn-sm mb-2" href="create.php">Tambah Mahasiswa</a>
                          <!-- show alert -->
                          <?php
                              if (isset($_SESSION['flash_message']) && isset($_GET['msg'])) { 
                                  if ($_GET['msg'] == '1') {
                                      alert($_SESSION['flash_message'], 1);
                                  }else{
                                      alert($_SESSION['flash_message'], 0);
                                  }
                              }
                          ?>
                          <table class="table table-stripped table-bordered">
                              <thead>
                                  <tr>
                                      <th>#</th>
                                      <th>NIM</th>
                                      <th>NAMA</th>
                                      <th>JURUSAN</th>
                                      <th>ACTION</th>
                                  </tr>
                              </thead>
                              <tbody>
                                  <?php $no=1; while ($row = $result->fetch_assoc()) { ?>
                                      <tr>
                                          <td><?=$no++?></td>
                                          <td><?=$row['nim']?></td>
                                          <td><?=$row['nama']?></td>
                                          <td><?=$row['jurusan']?></td>
                                          <td>
                                              <a class="btn btn-success btn-sm" href="edit.php?id=<?=$row['id']?>">Edit</a>
                                              <a class="btn btn-danger btn-sm" href="function/Mahasiswa.php?action=delete&&id=<?=$row ['id']?>" onclick="return confirm('Anda yakin ingin menghapus Data <?php echo $row['nama'];?>?');">Hapus</a>
                                          </td>
                                      </tr>
                                  <?php } ?>
                              </tbody>
      
                          </table>
      
                      </div>
                  </div>
              </div>
              <script src="assets/js/bootstrap.bundle.min.js"></script>
          </body>
      </html>

      Create.php

      File ini berisi form input data mahasiswa

      <!doctype html>
      <html lang="en">
          <head>
              <meta charset="utf-8">
              <meta name="viewport" content="width=device-width, initial-scale=1">
              <title>OOP - Create</title>
              <link href="assets/css/bootstrap.min.css" rel="stylesheet">
          </head>
          <body>
              <div class="container">
                  <div class="row">
                      <h1>Create Mahasiswa</h1>
                      <form action="function/Mahasiswa.php?action=create" method="post">
                          <div class="form-group">
                              <label for="nim">NIM</label>
                              <input type="text" class="form-control" name="nim" required>
                          </div>
                          <div class="form-group">
                              <label for="nama">Nama</label>
                              <input type="text" class="form-control" name="nama" required>
                          </div>
                          <div class="form-group">
                              <label for="jurusan">Jurusan</label>
                              <input type="text" class="form-control" name="jurusan" required>
                          </div>
                              <button type="submit" class="btn btn-primary mt-2">Create</button>
                      </form>
                  </div>
              </div>
              <script src="assets/js/bootstrap.bundle.min.js"></script>
          </body>
      </html>

      Edit.php

      File ini berisi form untuk melakukan perubahan data mahasiswa

      <?php
      include_once './config/Database.php'; 
      include_once './model/Mahasiswa.php';
      
      $database = new Database();
      $db = $database->getConnection();
      
      $mahasiswa = new Mahasiswa($db);
      
      if (isset($_GET['id'])) {
      $result = $mahasiswa->read($_GET['id'])->fetch_assoc();
      }
      ?>
      <!doctype html>
      <html lang="en">
          <head>
              <meta charset="utf-8">
              <meta name="viewport" content="width=device-width, initial-scale=1">
              <title>OOP - Edit</title>
              <link href="assets/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-SgOJa3DmI69IUzQ2PVdRZhwQ+dy64/BUtbMJw1MZ8t5HZApcHrRKUc4W0kG879m7" crossorigin="anonymous">
          </head>
          <body>
              <div class="container">
                  <div class="row">
                      <h1>Edit Mahasiswa</h1>
                      <form action="function/Mahasiswa.php?action=update" method="post">
                          <div class="form-group">
                              <label for="nim">NIM</label>
                              <input type="hidden" class="form-control" name="id" value="<?=$result['id'];?>" required>
                              <input type="text" class="form-control" name="nim" value="<?=$result['nim'];?>" required>
                          </div>
                          <div class="form-group">
                              <label for="nama">Nama</label>
                              <input type="text" class="form-control" name="nama" value="<?=$result['nama'];?>" required>
                          </div>
                          <div class="form-group">
                              <label for="jurusan">Jurusan</label>
                              <input type="text" class="form-control" name="jurusan" value="<?=$result['jurusan'];?>" required>
                          </div>
                          <button type="submit" class="btn btn-primary mt- 2">Update</button>
                      </form>
                  </div>
              </div>
              <script src="assets/js/bootstrap.bundle.min.js" integrity="sha384-k6d4wzSIapyDyv1kpU366/PK5hCdSbCRGRCMv+eplOQJWyd1fbcAu9OCUj5zNLiq" crossorigin="anonymous"></script>
          </body>
      </html>

      H. Efisiensi Kode

      Program CRUD dapat diefisiensi dengan menggabungkan halaman create.php dan edit.php menjadi satu, dengan nama form.php. logika if else digunakan pada form.php, Jadi ketika query yang diminta adalah create maka form.php akan menampilkan kondisi yang sesuai untuk create data, dan sebaliknya. Setelah itu, di index.php ubah bagian-bagian yang mereferensi ke create.php dan edit.php menjadi mereferensi ke form.php. Jika sudah berhasil, file create.php dan edit.php bisa dihapus.

      buat form.php dengan isi kode berikut:

      <?php
      include_once './config/Database.php';
      include_once './model/Mahasiswa.php';
      
      $database = new Database();
      $db = $database->getConnection();
      $mahasiswa = new Mahasiswa($db);
      
      $isEdit = false;
      $data = [
          'id' => '',
          'nim' => '',
          'nama' => '',
          'jurusan' => ''
      ];
      
      if (isset($_GET['id'])) {
          $result = $mahasiswa->read($_GET['id'])->fetch_assoc();
          if ($result) {
              $isEdit = true;
              $data = $result;
          }
      }
      
      $formAction = $isEdit ? 'function/Mahasiswa.php?action=update' : 'function/Mahasiswa.php?action=create';
      $formTitle = $isEdit ? 'Edit Mahasiswa' : 'Create Mahasiswa';
      $submitText = $isEdit ? 'Update' : 'Create';
      ?>
      
      <!doctype html>
      <html lang="en">
      <head>
          <meta charset="utf-8">
          <meta name="viewport" content="width=device-width, initial-scale=1">
          <title><?= $formTitle ?></title>
          <link href="assets/css/bootstrap.min.css" rel="stylesheet">
      </head>
      <body>
      <div class="container">
          <div class="row">
              <h1><?= $formTitle ?></h1>
              <form action="<?= $formAction ?>" method="post">
                  <?php if ($isEdit): ?>
                      <input type="hidden" name="id" value="<?= $data['id'] ?>">
                  <?php endif; ?>
                  <div class="form-group">
                      <label for="nim">NIM</label>
                      <input type="text" class="form-control" name="nim" value="<?= $data['nim'] ?>" required>
                  </div>
                  <div class="form-group">
                      <label for="nama">Nama</label>
                      <input type="text" class="form-control" name="nama" value="<?= $data['nama'] ?>" required>
                  </div>
                  <div class="form-group">
                      <label for="jurusan">Jurusan</label>
                      <input type="text" class="form-control" name="jurusan" value="<?= $data['jurusan'] ?>" required>
                  </div>
                  <button type="submit" class="btn btn-primary mt-2"><?= $submitText ?></button>
              </form>
          </div>
      </div>
      <script src="assets/js/bootstrap.bundle.min.js"></script>
      </body>
      </html>