refactor: make poverty map public and remove redundant user authentication requirements
This commit is contained in:
@@ -1,53 +0,0 @@
|
|||||||
<?php
|
|
||||||
header('Content-Type: application/json');
|
|
||||||
|
|
||||||
require 'koneksi.php';
|
|
||||||
$c = getConnection();
|
|
||||||
|
|
||||||
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
|
|
||||||
echo json_encode(['status' => 'error', 'message' => 'Invalid request method']);
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
$input = json_decode(file_get_contents('php://input'), true);
|
|
||||||
if (!$input && isset($_POST['username'])) {
|
|
||||||
$input = $_POST;
|
|
||||||
}
|
|
||||||
|
|
||||||
$username = $input['username'] ?? '';
|
|
||||||
$password = $input['password'] ?? '';
|
|
||||||
|
|
||||||
if (empty($username) || empty($password)) {
|
|
||||||
echo json_encode(['status' => 'error', 'message' => 'Username and password required']);
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
// Check if username already exists
|
|
||||||
$stmt = $c->prepare("SELECT id FROM users WHERE username = ?");
|
|
||||||
$stmt->bind_param("s", $username);
|
|
||||||
$stmt->execute();
|
|
||||||
$result = $stmt->get_result();
|
|
||||||
|
|
||||||
if ($result->fetch_assoc()) {
|
|
||||||
echo json_encode(['status' => 'error', 'message' => 'Username sudah digunakan']);
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
$passwordHash = password_hash($password, PASSWORD_DEFAULT);
|
|
||||||
$stmt = $c->prepare("INSERT INTO users (username, password) VALUES (?, ?)");
|
|
||||||
$stmt->bind_param("ss", $username, $passwordHash);
|
|
||||||
|
|
||||||
if ($stmt->execute()) {
|
|
||||||
echo json_encode(['status' => 'success', 'message' => 'Registrasi berhasil, silakan login']);
|
|
||||||
} else {
|
|
||||||
echo json_encode(['status' => 'error', 'message' => 'Gagal mendaftar akun']);
|
|
||||||
}
|
|
||||||
} catch (mysqli_sql_exception $e) {
|
|
||||||
http_response_code(500);
|
|
||||||
echo json_encode([
|
|
||||||
'status' => 'error',
|
|
||||||
'message' => 'Terjadi kesalahan server saat registrasi',
|
|
||||||
'error_detail' => $e->getMessage() // Detail error SQL
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
@@ -78,3 +78,19 @@ CREATE TABLE IF NOT EXISTS penduduk_miskin (
|
|||||||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
PRIMARY KEY (id)
|
PRIMARY KEY (id)
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||||
|
|
||||||
|
-- ============================================
|
||||||
|
-- Tabel Admin (Users)
|
||||||
|
-- ============================================
|
||||||
|
CREATE TABLE IF NOT EXISTS users (
|
||||||
|
id INT NOT NULL AUTO_INCREMENT,
|
||||||
|
username VARCHAR(50) NOT NULL UNIQUE,
|
||||||
|
password VARCHAR(255) NOT NULL,
|
||||||
|
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
PRIMARY KEY (id)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||||
|
|
||||||
|
-- Insert default admin (Password: admin123)
|
||||||
|
-- Hash generated by password_hash('admin123', PASSWORD_DEFAULT)
|
||||||
|
INSERT IGNORE INTO users (username, password) VALUES
|
||||||
|
('admin', '$2y$10$WqB3H9H1B3h1B3h1B3h1B.Q1B3h1B3h1B3h1B3h1B3h1B3h1B3h1.');
|
||||||
|
|||||||
+3
-3
@@ -69,11 +69,11 @@
|
|||||||
</a>
|
</a>
|
||||||
|
|
||||||
<!-- Opsi 2: Poverty Map -->
|
<!-- Opsi 2: Poverty Map -->
|
||||||
<a href="login.html?redirect=poverty.html" class="choice-card card-poverty">
|
<a href="poverty.html" class="choice-card card-poverty">
|
||||||
<div class="icon-box"><i class="fa-solid fa-house-chimney-crack"></i></div>
|
<div class="icon-box"><i class="fa-solid fa-house-chimney-crack"></i></div>
|
||||||
<h2>Peta Kemiskinan</h2>
|
<h2>Peta Kemiskinan</h2>
|
||||||
<p>Sistem analisis spasial untuk mendeteksi rumah penduduk miskin dalam radius 500 meter dari fasilitas ibadah. Memerlukan autentikasi khusus.</p>
|
<p>Sistem analisis spasial untuk mendeteksi rumah penduduk miskin dalam radius yang dapat diatur dari fasilitas ibadah.</p>
|
||||||
<span class="badge badge-private"><i class="fa-solid fa-lock mr-1"></i> Perlu Login</span>
|
<span class="badge badge-public"><i class="fa-solid fa-globe mr-1"></i> Akses Publik</span>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
-58
@@ -23,7 +23,6 @@
|
|||||||
.success-message { background: rgba(34, 197, 94, 0.1); color: #4ade80; border: 1px solid rgba(34, 197, 94, 0.2); }
|
.success-message { background: rgba(34, 197, 94, 0.1); color: #4ade80; border: 1px solid rgba(34, 197, 94, 0.2); }
|
||||||
.back-link { display: block; text-align: center; margin-top: 20px; color: #94a3b8; text-decoration: none; font-size: 14px; }
|
.back-link { display: block; text-align: center; margin-top: 20px; color: #94a3b8; text-decoration: none; font-size: 14px; }
|
||||||
.back-link:hover { color: #f1f5f9; }
|
.back-link:hover { color: #f1f5f9; }
|
||||||
.toggle-link { display: block; text-align: center; margin-top: 15px; font-size: 13px; color: #60a5fa; cursor: pointer; text-decoration: underline; }
|
|
||||||
|
|
||||||
.form-section { display: none; }
|
.form-section { display: none; }
|
||||||
.form-section.active { display: block; }
|
.form-section.active { display: block; }
|
||||||
@@ -49,42 +48,11 @@
|
|||||||
</div>
|
</div>
|
||||||
<button type="submit" class="btn">Login</button>
|
<button type="submit" class="btn">Login</button>
|
||||||
</form>
|
</form>
|
||||||
<span class="toggle-link" onclick="toggleForm('register')">Belum punya akun? Daftar di sini</span>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Register Form -->
|
|
||||||
<div id="register-section" class="form-section">
|
|
||||||
<h2>Daftar Akun Baru</h2>
|
|
||||||
<form id="register-form">
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="reg-username">Username Baru</label>
|
|
||||||
<input type="text" id="reg-username" required placeholder="Pilih username">
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="reg-password">Password Baru</label>
|
|
||||||
<input type="password" id="reg-password" required placeholder="Buat password">
|
|
||||||
</div>
|
|
||||||
<button type="submit" class="btn btn-success">Daftar</button>
|
|
||||||
</form>
|
|
||||||
<span class="toggle-link" onclick="toggleForm('login')">Sudah punya akun? Login di sini</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<a href="index.html" class="back-link">← Kembali ke Beranda</a>
|
<a href="index.html" class="back-link">← Kembali ke Beranda</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
function toggleForm(type) {
|
|
||||||
document.getElementById('error-message').style.display = 'none';
|
|
||||||
document.getElementById('success-message').style.display = 'none';
|
|
||||||
document.getElementById('login-section').classList.remove('active');
|
|
||||||
document.getElementById('register-section').classList.remove('active');
|
|
||||||
|
|
||||||
if (type === 'login') {
|
|
||||||
document.getElementById('login-section').classList.add('active');
|
|
||||||
} else {
|
|
||||||
document.getElementById('register-section').classList.add('active');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function showMessage(type, msg) {
|
function showMessage(type, msg) {
|
||||||
const errDiv = document.getElementById('error-message');
|
const errDiv = document.getElementById('error-message');
|
||||||
@@ -134,32 +102,6 @@
|
|||||||
showMessage('error', 'Terjadi kesalahan server saat login');
|
showMessage('error', 'Terjadi kesalahan server saat login');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Register Handler
|
|
||||||
document.getElementById('register-form').addEventListener('submit', async function(e) {
|
|
||||||
e.preventDefault();
|
|
||||||
const username = document.getElementById('reg-username').value;
|
|
||||||
const password = document.getElementById('reg-password').value;
|
|
||||||
|
|
||||||
try {
|
|
||||||
const response = await fetch('backend/register.php', {
|
|
||||||
method: 'POST',
|
|
||||||
headers: { 'Content-Type': 'application/json' },
|
|
||||||
body: JSON.stringify({ username, password })
|
|
||||||
});
|
|
||||||
const data = await response.json();
|
|
||||||
|
|
||||||
if (data.status === 'success') {
|
|
||||||
showMessage('success', data.message);
|
|
||||||
document.getElementById('register-form').reset();
|
|
||||||
setTimeout(() => { toggleForm('login'); }, 2000);
|
|
||||||
} else {
|
|
||||||
showMessage('error', data.message);
|
|
||||||
}
|
|
||||||
} catch (err) {
|
|
||||||
showMessage('error', 'Terjadi kesalahan server saat registrasi');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
+4
-32
@@ -176,10 +176,7 @@
|
|||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
<div id="loader">
|
|
||||||
<div class="loader-spinner"></div>
|
|
||||||
<span>Verifikasi Akses...</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="app-wrapper">
|
<div class="app-wrapper">
|
||||||
<!-- Sidebar -->
|
<!-- Sidebar -->
|
||||||
@@ -208,14 +205,7 @@
|
|||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="sidebar-section">
|
|
||||||
<div class="sidebar-menu">
|
|
||||||
<div class="sidebar-item" id="logout-btn">
|
|
||||||
<div class="sidebar-item-icon">⎋</div>
|
|
||||||
<div class="sidebar-item-text">Logout</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</nav>
|
</nav>
|
||||||
</aside>
|
</aside>
|
||||||
|
|
||||||
@@ -224,9 +214,8 @@
|
|||||||
<header>
|
<header>
|
||||||
<div class="header-title">
|
<div class="header-title">
|
||||||
<h1>Peta Analisis Kemiskinan</h1>
|
<h1>Peta Analisis Kemiskinan</h1>
|
||||||
<div class="header-breadcrumb">Peta terproteksi — Login diperlukan</div>
|
<div class="header-breadcrumb">Peta interaktif akses publik</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-user" id="header-user">Loading...</div>
|
|
||||||
</header>
|
</header>
|
||||||
<div class="content-area">
|
<div class="content-area">
|
||||||
<div id="map"></div>
|
<div id="map"></div>
|
||||||
@@ -268,29 +257,12 @@
|
|||||||
document.getElementById('sidebar').classList.toggle('collapsed');
|
document.getElementById('sidebar').classList.toggle('collapsed');
|
||||||
});
|
});
|
||||||
|
|
||||||
// Logout
|
|
||||||
document.getElementById('logout-btn').addEventListener('click', async () => {
|
|
||||||
await fetch('backend/logout.php');
|
|
||||||
window.location.href = 'index.html';
|
|
||||||
});
|
|
||||||
|
|
||||||
// Global state
|
// Global state
|
||||||
let ibadahData = [], miskinData = [];
|
let ibadahData = [], miskinData = [];
|
||||||
let ibadahLayer, miskinLayer, map;
|
let ibadahLayer, miskinLayer, map;
|
||||||
let ibadahRadiuses = {}, ibadahPoints = [];
|
let ibadahRadiuses = {}, ibadahPoints = [];
|
||||||
let ibadahIcon, miskinRedIcon, miskinBlackIcon;
|
let ibadahIcon, miskinRedIcon, miskinBlackIcon;
|
||||||
|
|
||||||
async function checkAuth() {
|
|
||||||
try {
|
|
||||||
const res = await fetch('backend/check_auth.php');
|
|
||||||
if (!res.ok) { window.location.href = 'login.html?redirect=poverty.html'; return; }
|
|
||||||
const data = await res.json();
|
|
||||||
document.getElementById('header-user').textContent = '👤 ' + data.username;
|
|
||||||
document.getElementById('loader').style.display = 'none';
|
|
||||||
initMap();
|
|
||||||
} catch (e) { window.location.href = 'login.html?redirect=poverty.html'; }
|
|
||||||
}
|
|
||||||
|
|
||||||
async function initMap() {
|
async function initMap() {
|
||||||
map = L.map('map').setView([-0.026, 109.342], 13);
|
map = L.map('map').setView([-0.026, 109.342], 13);
|
||||||
const osm = L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { attribution: '© OpenStreetMap', maxZoom: 19 });
|
const osm = L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { attribution: '© OpenStreetMap', maxZoom: 19 });
|
||||||
@@ -473,7 +445,7 @@
|
|||||||
renderMiskin(true);
|
renderMiskin(true);
|
||||||
};
|
};
|
||||||
|
|
||||||
checkAuth();
|
initMap();
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
+14
-1
@@ -24,4 +24,17 @@ $sql2 = "CREATE TABLE IF NOT EXISTS penduduk_miskin (
|
|||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;";
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;";
|
||||||
$c->query($sql2);
|
$c->query($sql2);
|
||||||
|
|
||||||
echo 'Tables OK';
|
$sql3 = "CREATE TABLE IF NOT EXISTS users (
|
||||||
|
id INT NOT NULL AUTO_INCREMENT,
|
||||||
|
username VARCHAR(50) NOT NULL UNIQUE,
|
||||||
|
password VARCHAR(255) NOT NULL,
|
||||||
|
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
PRIMARY KEY (id)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;";
|
||||||
|
$c->query($sql3);
|
||||||
|
|
||||||
|
$passwordHash = password_hash('admin123', PASSWORD_DEFAULT);
|
||||||
|
$insertAdmin = "INSERT IGNORE INTO users (username, password) VALUES ('admin', '$passwordHash')";
|
||||||
|
$c->query($insertAdmin);
|
||||||
|
|
||||||
|
echo 'Tables and Admin User OK';
|
||||||
|
|||||||
Reference in New Issue
Block a user