Tugas 4 PBKK (B)

Membuat fitur login

Untuk tugas 4 kali ini, saya akan menambahkan fitur login ke website yang sudah pernah dibahas sebelumnya.

1. Buat tabel users

Buka phpmyadmin dan gunakan snippet berikut untuk menambahkan tabel users ke database (Gunakan tab SQL untuk memasukkan ini)

CREATE TABLE `users` (
  `user_id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(64) NOT NULL,
  `password` varchar(255) NOT NULL,
  `email` varchar(255) NOT NULL,
  `full_name` varchar(255) NOT NULL,
  `phone` varchar(20) NOT NULL,
  `role` enum('admin','customer') NOT NULL DEFAULT 'customer',
  `last_login` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `photo` varchar(64) NOT NULL DEFAULT 'user_no_image.jpg',
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `is_active` tinyint(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`user_id`)
);

Kemudian buat data untuk admin.

INSERT INTO `users`
            (`user_id`,
             `username`,
             `password`,
             `email`,
             `full_name`,
             `phone`,
             `role`,
             `last_login`,
             `photo`,
             `created_at`,
             `is_active`)
VALUES      (NULL,
             'admin',
             '$2y$10$Gycyp1gLmH70hJkVOz0KxeRIIywxsL3F4qzjbkvXJDb.BJy3G3x02',
             'admin@services.local',
             'admin',
             '081333332176',
             'admin',
             CURRENT_TIMESTAMP(),
             'user_no_image.jpg',
             CURRENT_TIMESTAMP(),
             '0') 


2. Buat model "User_model"

Setelah membuat datanya, kita buat model untuk CI agar bisa berhubungan dengan database. Buat file "application\models\User_model.php" dan isi dengan snippet berikut.

<?php
defined("BASEPATH") OR exit("No direct script access allowed");

class User_model extends CI_Model
{
  private $_table = "users";

  public function do_login()
  {
    $post = $this->input->post();
    $this->db->where("email", $post["email"])->or_where("username", $post["email"]);
    $user = $this->db->get($this->_table)->row();

    if ($user)
    {
      $is_pw_true = password_verify($post["password"], $user->password);
      $is_admin = $user->role == "admin";
      if ($is_pw_true && $is_admin)
      {
        $this->session->set_userdata(["user_logged" => $user]);
        $this->_updateLastLogin($user->user_id);
        return true;
      }
    }
    return false;
  }

  public function is_not_login()
  {
    return $this->session->userdata("user_logged") === null;
  }

  public function _updateLastLogin($user_id)
  {
    $sql = "UPDATE {$this->_table} SET last_login = now() WHERE user_id = {$user_id}";
    $this->db->query($sql);
  }
}

3. Membuat controller Login

Setelah membuat modelnya, kita buat controllernya untuk menjembatani model dengan view. Buat file "application\controllers\admin\Login.php" dan isi dengan snippet berikut

<?php
defined("BASEPATH") OR exit("No direct script access allowed");

class Login extends CI_Controller
{
  public function __construct()
  {
    parent::__construct();
    $this->load->model("user_model");
    $this->load->library("form_validation");
  }

  public function index()
  {
    if ($this->input->post())
    {
      if ($this->user_model->do_login())
        redirect(site_url("admin"));
    }
    $this->load->view("admin/login_page.php");
  }

  public function logout()
  {
    $this->session->sess_destroy();
    redirect(site_url("admin/login"));
  }
}

Dan juga untuk file Overview.php dan Service.php tambahkan snippet berikut di fungsi __construct()

$this->load->model("user_model");
if ($this->user_model->is_not_login())
  redirect(site_url("admin/login"));

4. Membuat view login_page.php

Setelah model dan controller, kita buat viewnya. Buat file "application\views\admin\login_page.php" dan isi dengan snippet berikut

<!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>Login Admin</title>

  <!-- Bootstrap core CSS-->
  <link href="<?php echo base_url('assets/css/styles.css') ?>" rel="stylesheet">
</head>

<body>

  <div class="container">
    <div class="row">
      <div class="col-12 col-md-6 text-center mt-5 mx-auto p-4">
        <h1 class="h2">Login Admin</h1>
        <p class="lead">Silahkan masuk ke Panel Admin</p>
      </div>
    </div>
    <div class="row">
      <div class="col-12 col-md-5 mx-auto mt-5">
        <form action="<?= site_url('admin/login') ?>" method="POST">
          <div class="form-group">
            <label for="email">Email</label>
            <input type="text" class="form-control" name="email" placeholder="Pakai username juga bisa.." required />
          </div>
          <div class="form-group">
            <label for="password">Password</label>
            <input type="password" class="form-control" name="password" placeholder="Password.." required />
          </div>
          <div class="form-group">
            <div class="d-flex justify-content-between">
              <div class="custom-control custom-checkbox">
                <input type="checkbox" class="custom-control-input" name="rememberme" id="rememberme" />
                <label class="custom-control-label" for="rememberme"> Ingat Saya</label>
              </div>
              <a href="<?= site_url('reset_password') ?>">Lupa Password?</a>
            </div>
          </div>
          <div class="form-group">
            <input type="submit" class="btn btn-success w-100" value="Login" />
          </div>

        </form>
      </div>
    </div>
  </div>

</body>

</html>

5. Selesai

Login sudah terimplementasikan
login_page.php
Setelah login

Source code bisa dilihat di sini

Comments