This commit is contained in:
2026-06-10 19:26:40 +07:00
parent 02c8394972
commit 7e2d324c2e
49 changed files with 6334 additions and 0 deletions
+12
View File
@@ -0,0 +1,12 @@
<?php
include 'koneksi.php';
$data = [];
$result = $conn->query("SELECT * FROM spbu");
while($row = $result->fetch_assoc()){
$data[] = $row;
}
echo json_encode($data);
?>
+13
View File
@@ -0,0 +1,13 @@
<?php
include 'koneksi.php';
$result = $conn->query("SELECT * FROM spbu");
$data = [];
while($row = $result->fetch_assoc()){
$data[] = $row;
}
echo json_encode($data);
?>
+18
View File
@@ -0,0 +1,18 @@
<?php
include 'koneksi.php';
$id = $_POST['id'];
$nama = $_POST['nama_spbu'];
$wa = $_POST['no_wa'];
$status = $_POST['status'];
$sql = "UPDATE spbu
SET nama_spbu='$nama', no_wa='$wa', status='$status'
WHERE id='$id'";
if($conn->query($sql)){
echo "success";
}else{
echo "error: " . $conn->error;
}
?>
+13
View File
@@ -0,0 +1,13 @@
<?php
include 'koneksi.php';
$id = $_POST['id'];
$sql = "DELETE FROM spbu WHERE id='$id'";
if ($conn->query($sql)) {
echo "success";
} else {
echo "error: " . $conn->error;
}
?>
+80
View File
@@ -0,0 +1,80 @@
<!DOCTYPE html>
<html lang="en">
<head>
<base target="_top">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Quick Start - Leaflet</title>
<link rel="shortcut icon" type="image/x-icon" href="docs/images/favicon.ico" />
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" integrity="sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY=" crossorigin=""/>
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js" integrity="sha256-20nQCchB9co0qIjJZRGuk2/Z9VM+kNiyxNV1lvTlZBo=" crossorigin=""></script>
<style>
html, body {
height: 100%;
margin: 0;
}
.leaflet-container {
height: 400px;
width: 600px;
max-width: 100%;
max-height: 100%;
}
</style>
</head>
<body>
<div id="map" style="width: 600px; height: 400px;"></div>
<script>
const map = L.map('map').setView([-0.0552679922693441, 109.34961134769004], 13);
const tiles = L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {
maxZoom: 19,
attribution: '&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>'
}).addTo(map);
const marker = L.marker([-0.0552679922693441, 109.34961134769004]).addTo(map)
.bindPopup('<b>Hello world!</b><br />I am a popup.').openPopup();
const circle = L.circle([-0.056, 109.35], {
color: 'red',
fillColor: '#f03',
fillOpacity: 0.5,
radius: 500
}).addTo(map).bindPopup('I am a circle.');
const polygon = L.polygon([
[-0.054, 109.34],
[-0.057, 109.36],
[-0.052, 109.355]
]).addTo(map).bindPopup('I am a polygon.');
const popup = L.popup()
.setLatLng([51.513, -0.09])
.setContent('I am a standalone popup.')
.openOn(map);
function onMapClick(e) {
popup
.setLatLng(e.latlng)
.setContent(`You clicked the map at ${e.latlng.toString()}`)
.openOn(map);
}
map.on('click', onMapClick);
</script>
</body>
</html>
+197
View File
@@ -0,0 +1,197 @@
<!DOCTYPE html>
<html>
<head>
<title>Peta SPBU</title>
<link rel="stylesheet" href="https://unpkg.com/leaflet/dist/leaflet.css"/>
<script src="https://unpkg.com/leaflet/dist/leaflet.js"></script>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<style>
#map { height: 100vh; }
</style>
</head>
<body>
<div id="map"></div>
<script>
// ================= MAP =================
var map = L.map('map').setView([-0.055353822919599796, 109.3495577035227], 15);
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {}).addTo(map);
// ================= ICON =================
var iconHijau = L.icon({
iconUrl: 'https://maps.google.com/mapfiles/ms/icons/green-dot.png',
iconSize: [32,32]
});
var iconMerah = L.icon({
iconUrl: 'https://maps.google.com/mapfiles/ms/icons/red-dot.png',
iconSize: [32,32]
});
// ================= LOAD DATA =================
function loadData(){
$.getJSON("ambil.php", function(data){
data.forEach(function(d){
var icon = (d.status === "yes") ? iconHijau : iconMerah;
var marker = L.marker([d.lat, d.lng], {
icon: icon,
draggable: true
}).addTo(map);
// simpan id di marker
marker.spbu_id = d.id;
// popup edit + hapus
var popup = `
<form onsubmit="updateData(event, ${d.id})">
<b>Edit SPBU</b><br><br>
Nama:<br>
<input type="text" name="nama_spbu" value="${d.nama_spbu}" required><br><br>
WA:<br>
<input type="text" name="no_wa" value="${d.no_wa}" required><br><br>
Status:<br>
<select name="status">
<option value="yes" ${d.status=="yes"?"selected":""}>Yes</option>
<option value="no" ${d.status=="no"?"selected":""}>No</option>
</select><br><br>
<button type="submit">Update</button>
<button type="button" onclick="hapusData(${d.id})">Hapus</button>
</form>
`;
marker.bindPopup(popup);
// drag update koordinat
marker.on('dragend', function(){
var pos = marker.getLatLng();
$.post("update.php", {
id: d.id,
lat: pos.lat,
lng: pos.lng
});
});
});
});
}
loadData();
// ================= TAMBAH DATA =================
map.on('click', function(e){
var form = `
<form id="formSPBU">
<b>Tambah SPBU</b><br><br>
Nama:<br>
<input type="text" name="nama_spbu" required><br><br>
WA:<br>
<input type="text" name="no_wa" required><br><br>
Status:<br>
<select name="status">
<option value="yes">Yes</option>
<option value="no">No</option>
</select><br><br>
<input type="hidden" name="lat" value="${e.latlng.lat}">
<input type="hidden" name="lng" value="${e.latlng.lng}">
<button type="submit">Simpan</button>
</form>
`;
L.popup().setLatLng(e.latlng).setContent(form).openOn(map);
});
// ================= SIMPAN =================
$(document).on('submit','#formSPBU', function(e){
e.preventDefault();
var formData = $(this).serialize();
$.post("simpan.php", formData, function(res){
if(res.trim() === "success"){
alert("✅ Data berhasil disimpan");
map.closePopup();
location.reload(); // biar muncul dengan id
} else {
alert("❌ ERROR: " + res);
}
});
});
// ================= UPDATE DATA =================
function updateData(e, id){
e.preventDefault();
var form = e.target;
var data = $(form).serialize() + "&id=" + id;
$.post("edit.php", data, function(res){
if(res.trim() === "success"){
alert("✅ Data diupdate");
location.reload();
}else{
alert("" + res);
}
});
}
// ================= HAPUS =================
function hapusData(id){
if(confirm("Yakin hapus data ini?")){
$.post("hapus.php", {id:id}, function(res){
if(res.trim() === "success"){
// hapus marker langsung dari map
map.eachLayer(function(layer){
if(layer.spbu_id == id){
map.removeLayer(layer);
}
});
alert("✅ Data dihapus");
} else {
alert("❌ Gagal: " + res);
}
});
}
}
</script>
</body>
</html>
+15
View File
@@ -0,0 +1,15 @@
<?php
$host = getenv('DB_HOST') ?: 'localhost';
$user = getenv('DB_USER') ?: 'root';
$pass = getenv('DB_PASSWORD');
$pass = ($pass === false) ? '' : $pass;
$db = getenv('DB_NAME') ?: 'spbu_db';
$conn = new mysqli($host, $user, $pass, $db);
if ($conn->connect_error) {
die("Koneksi database gagal: " . $conn->connect_error);
}
$conn->set_charset("utf8mb4");
?>
+18
View File
@@ -0,0 +1,18 @@
<?php
include 'koneksi.php';
$nama = $_POST['nama_spbu'];
$wa = $_POST['no_wa'];
$status = $_POST['status'];
$lat = $_POST['lat'];
$lng = $_POST['lng'];
$sql = "INSERT INTO spbu (nama_spbu, no_wa, status, lat, lng)
VALUES ('$nama', '$wa', '$status', '$lat', '$lng')";
if ($conn->query($sql)) {
echo "success";
} else {
echo "error: " . $conn->error;
}
?>
+24
View File
@@ -0,0 +1,24 @@
<?php
include 'koneksi.php';
// DEBUG: cek apakah data terkirim
if (!isset($_POST['nama_spbu'])) {
echo "error: data tidak masuk";
exit;
}
$nama = $_POST['nama_spbu'];
$wa = $_POST['no_wa'];
$status = $_POST['status'];
$lat = $_POST['lat'];
$lng = $_POST['lng'];
$sql = "INSERT INTO spbu (nama_spbu, no_wa, status, lat, lng)
VALUES ('$nama', '$wa', '$status', '$lat', '$lng')";
if ($conn->query($sql)) {
echo "success";
} else {
echo "error: " . $conn->error; // 🔥 ini penting
}
?>
+77
View File
@@ -0,0 +1,77 @@
-- phpMyAdmin SQL Dump
-- version 5.2.1
-- https://www.phpmyadmin.net/
--
-- Host: 127.0.0.1
-- Generation Time: Jun 07, 2026 at 08:36 AM
-- Server version: 10.4.32-MariaDB
-- PHP Version: 8.2.12
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
START TRANSACTION;
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
--
-- Database: `spbu_db`
--
CREATE DATABASE IF NOT EXISTS `spbu_db` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
USE `spbu_db`;
-- --------------------------------------------------------
--
-- Table structure for table `spbu`
--
CREATE TABLE `spbu` (
`id` int(11) NOT NULL,
`nama_spbu` varchar(100) NOT NULL,
`no_wa` varchar(20) NOT NULL,
`status` enum('yes','no') NOT NULL,
`lat` double NOT NULL,
`lng` double NOT NULL,
`buka_24jam` enum('yes','no') DEFAULT 'no'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
--
-- Dumping data for table `spbu`
--
INSERT INTO `spbu` (`id`, `nama_spbu`, `no_wa`, `status`, `lat`, `lng`, `buka_24jam`) VALUES
(1, 'SPBU Wahidin', '12345678', 'yes', -0.05501782621888551, 109.34941275816585, 'no'),
(2, 'SPBU Ayani', '12323534', 'yes', -0.061969576295016156, 109.35348997289081, 'no'),
(3, 'SPBU Wahidin', '12345678', 'yes', -0.05553003299958369, 109.34949398529896, 'no'),
(4, 'SPBU Wahidin', '12345678', 'yes', -0.05518676231453869, 109.34936525640107, 'no'),
(5, 'SPBU Ayani', '12345678', 'no', -0.05385658839135921, 109.35633076365197, 'no');
--
-- Indexes for dumped tables
--
--
-- Indexes for table `spbu`
--
ALTER TABLE `spbu`
ADD PRIMARY KEY (`id`);
--
-- AUTO_INCREMENT for dumped tables
--
--
-- AUTO_INCREMENT for table `spbu`
--
ALTER TABLE `spbu`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6;
COMMIT;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
+15
View File
@@ -0,0 +1,15 @@
<?php
include 'koneksi.php';
$id = $_POST['id'];
$lat = $_POST['lat'];
$lng = $_POST['lng'];
$sql = "UPDATE spbu SET lat='$lat', lng='$lng' WHERE id='$id'";
if ($conn->query($sql)) {
echo "success";
} else {
echo "error: " . $conn->error;
}
?>
+28
View File
@@ -0,0 +1,28 @@
<?php
include 'koneksi.php';
$data = [];
// jalan
$q1 = $conn->query("SELECT * FROM jalan");
while($r = $q1->fetch_assoc()){
$r['tipe'] = "jalan";
$data[] = $r;
}
// tanah
$q2 = $conn->query("SELECT * FROM tanah");
while($r = $q2->fetch_assoc()){
$r['tipe'] = "tanah";
$data[] = $r;
}
// ================= RUSAK =================
$q3 = $conn->query("SELECT * FROM rusak");
while($r = $q3->fetch_assoc()){
$r['tipe'] = "rusak";
$data[] = $r;
}
echo json_encode($data);
?>
+16
View File
@@ -0,0 +1,16 @@
<?php
include 'koneksi.php';
$id = $_POST['id'];
$tipe = $_POST['tipe'];
$nama = $_POST['nama'];
if($tipe=="jalan"){
$sql = "UPDATE jalan SET nama_jalan='$nama' WHERE id='$id'";
}else{
$sql = "UPDATE tanah SET nama_pemilik='$nama' WHERE id='$id'";
}
$conn->query($sql);
echo "success";
?>
+18
View File
@@ -0,0 +1,18 @@
<?php
include 'koneksi.php';
$id = $_POST['id'];
$tipe = $_POST['tipe'];
if($tipe=="jalan"){
$sql = "DELETE FROM jalan WHERE id='$id'";
}else{
$sql = "DELETE FROM tanah WHERE id='$id'";
}
if($tipe=="rusak"){
$sql = "DELETE FROM rusak WHERE id='$id'";
}
$conn->query($sql);
echo "success";
?>
+321
View File
@@ -0,0 +1,321 @@
<!DOCTYPE html>
<html>
<head>
<title>WebGIS Jalan & Tanah</title>
<link rel="stylesheet" href="https://unpkg.com/leaflet/dist/leaflet.css"/>
<link rel="stylesheet" href="https://unpkg.com/leaflet-draw/dist/leaflet.draw.css"/>
<script src="https://unpkg.com/leaflet/dist/leaflet.js"></script>
<script src="https://unpkg.com/leaflet-draw/dist/leaflet.draw.js"></script>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<style>
#map { height: 100vh; }
</style>
</head>
<body>
<input type="text" id="search" placeholder="Cari data..."
style="position:absolute; top:10px; left:50px; z-index:1000; padding:8px;">
<div id="map"></div>
<script>
// ================= MAP =================
var map = L.map('map').setView([-0.0553538229, 109.3495577035], 13);
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png').addTo(map);
// ================= DRAW =================
var drawnItems = new L.FeatureGroup();
map.addLayer(drawnItems);
var drawControl = new L.Control.Draw({
draw: {
polyline: true,
polygon: true,
marker: true,
circle: false,
rectangle: false
},
edit: {
featureGroup: drawnItems
}
});
map.addControl(drawControl);
// ================= EVENT DRAW =================
map.on(L.Draw.Event.CREATED, function (e) {
var layer = e.layer;
drawnItems.addLayer(layer);
var geojson = layer.toGeoJSON();
// ===== JALAN =====
if (e.layerType === 'polyline') {
var latlngs = layer.getLatLngs();
var panjang = 0;
for (var i=0; i<latlngs.length-1; i++) {
panjang += latlngs[i].distanceTo(latlngs[i+1]);
}
var form = `
<form id="formJalan">
Nama Jalan:<br>
<input type="text" name="nama_jalan" required><br><br>
Status:<br>
<select name="status">
<option value="nasional">Nasional</option>
<option value="provinsi">Provinsi</option>
<option value="kabupaten">Kabupaten</option>
</select><br><br>
<b>Panjang: ${panjang.toFixed(2)} meter</b><br><br>
<input type="hidden" name="panjang" value="${panjang}">
<input type="hidden" name="geom" value='${JSON.stringify(geojson)}'>
<button type="submit">Simpan Jalan</button>
</form>
`;
layer.bindPopup(form).openPopup();
}
// ===== TANAH =====
if (e.layerType === 'polygon') {
var luas = L.GeometryUtil.geodesicArea(layer.getLatLngs()[0]);
var form = `
<form id="formTanah">
Nama Pemilik:<br>
<input type="text" name="nama_pemilik" required><br><br>
Status:<br>
<select name="status">
<option value="SHM">SHM</option>
<option value="HGB">HGB</option>
<option value="HGU">HGU</option>
<option value="HP">HP</option>
</select><br><br>
<b>Luas: ${luas.toFixed(2)} m²</b><br><br>
<input type="hidden" name="luas" value="${luas}">
<input type="hidden" name="geom" value='${JSON.stringify(geojson)}'>
<button type="submit">Simpan Tanah</button>
</form>
`;
layer.bindPopup(form).openPopup();
}
// ===== TITIK RUSAK =====
if (e.layerType === 'marker') {
var latlng = layer.getLatLng();
var form = `
<form id="formRusak">
Nama Jalan:<br>
<input type="text" name="nama" required><br><br>
Keterangan:<br>
<textarea name="keterangan"></textarea><br><br>
<input type="hidden" name="lat" value="${latlng.lat}">
<input type="hidden" name="lng" value="${latlng.lng}">
<button type="submit">Simpan Titik Rusak</button>
</form>
`;
layer.bindPopup(form).openPopup();
}
});
// ================= SIMPAN =================
// jalan
$(document).on('submit','#formJalan', function(e){
e.preventDefault();
var formData = new FormData(this);
formData.append("tipe","jalan");
$.ajax({
url: "simpan.php",
type: "POST",
data: formData,
processData: false,
contentType: false,
success: function(res){
if(res.trim()=="success"){
alert("Jalan disimpan");
location.reload();
}else{
alert(res);
}
}
});
});
// tanah
$(document).on('submit','#formTanah', function(e){
e.preventDefault();
var formData = new FormData(this);
formData.append("tipe","tanah");
$.ajax({
url: "simpan.php",
type: "POST",
data: formData,
processData: false,
contentType: false,
success: function(res){
if(res.trim()=="success"){
alert("Tanah disimpan");
location.reload();
}else{
alert(res);
}
}
});
});
// rusak
$(document).on('submit','#formRusak', function(e){
e.preventDefault();
var formData = new FormData(this);
formData.append("tipe","rusak");
$.ajax({
url: "simpan.php",
type: "POST",
data: formData,
processData: false,
contentType: false,
success: function(res){
if(res.trim()=="success"){
alert("Titik disimpan");
location.reload();
}else{
alert(res);
}
}
});
});
// ================= LOAD DATA =================
$.getJSON("ambil.php", function(data){
data.forEach(function(d){
// ===== RUSAK =====
if(d.tipe=="rusak"){
var marker = L.marker([d.lat, d.lng]).addTo(map);
marker.bindPopup(d.nama);
}
// ===== LINE & POLYGON =====
if(d.geom){
var geo = JSON.parse(d.geom);
var color = "black";
if(d.tipe=="jalan"){
color = d.status=="nasional"?"red":
d.status=="provinsi"?"blue":"green";
}
if(d.tipe=="tanah"){
color = d.status=="SHM"?"green":
d.status=="HGB"?"blue":
d.status=="HGU"?"orange":"purple";
}
L.geoJSON(geo,{style:{color:color}}).addTo(map);
}
});
});
var semuaData = [];
// ambil data sekali
$.getJSON("ambil.php", function(data){
semuaData = data;
tampilkanData(data);
});
// function tampilkan data
function tampilkanData(data){
var group = L.featureGroup();
map.eachLayer(function(layer){
if(layer instanceof L.GeoJSON || layer instanceof L.Marker){
map.removeLayer(layer);
}
});
data.forEach(function(d){
// ===== POINT =====
if(d.tipe=="rusak"){
var marker = L.marker([d.lat, d.lng]).addTo(map);
marker.bindPopup(d.nama);
group.addLayer(marker);
}
// ===== LINE & POLYGON =====
if(d.geom){
var geo = JSON.parse(d.geom);
var layer = L.geoJSON(geo).addTo(map);
group.addLayer(layer);
}
});
// 🔥 AUTO ZOOM KE HASIL
if(group.getLayers().length > 0){
map.fitBounds(group.getBounds());
}
}
// SEARCH REALTIME
$('#search').on('keyup', function(){
var key = $(this).val().toLowerCase();
var hasil = semuaData.filter(function(d){
if(d.tipe=="jalan"){
return d.nama_jalan.toLowerCase().includes(key);
}
if(d.tipe=="tanah"){
return d.nama_pemilik.toLowerCase().includes(key);
}
if(d.tipe=="rusak"){
return d.nama.toLowerCase().includes(key);
}
});
tampilkanData(hasil);
});
</script>
</body>
</html>
+15
View File
@@ -0,0 +1,15 @@
<?php
$host = getenv('DB_HOST') ?: 'localhost';
$user = getenv('DB_USER') ?: 'root';
$pass = getenv('DB_PASSWORD');
$pass = ($pass === false) ? '' : $pass;
$db = getenv('DB_NAME') ?: 'webgis2';
$conn = new mysqli($host, $user, $pass, $db);
if ($conn->connect_error) {
die("Koneksi database gagal: " . $conn->connect_error);
}
$conn->set_charset("utf8mb4");
?>
+74
View File
@@ -0,0 +1,74 @@
<?php
ini_set('display_errors',1);
error_reporting(E_ALL);
include 'koneksi.php';
if(!isset($_POST['tipe'])){
die("Error: tipe tidak ada");
}
$tipe = $_POST['tipe'];
// ================= JALAN =================
if($tipe=="jalan"){
$nama = $_POST['nama_jalan'];
$status = $_POST['status'];
$panjang = $_POST['panjang'];
$geom = $_POST['geom'];
$sql = "INSERT INTO jalan (nama_jalan,status,panjang,geom)
VALUES (?,?,?,?)";
$stmt = $conn->prepare($sql);
$stmt->bind_param("ssds",$nama,$status,$panjang,$geom);
if($stmt->execute()){
echo "success";
}else{
echo "Error: ".$stmt->error;
}
}
// ================= TANAH =================
if($tipe=="tanah"){
$nama = $_POST['nama_pemilik'];
$status = $_POST['status'];
$luas = $_POST['luas'];
$geom = $_POST['geom'];
$sql = "INSERT INTO tanah (nama_pemilik,status,luas,geom)
VALUES (?,?,?,?)";
$stmt = $conn->prepare($sql);
$stmt->bind_param("ssds",$nama,$status,$luas,$geom);
if($stmt->execute()){
echo "success";
}else{
echo "Error: ".$stmt->error;
}
}
// ================= POINT RUSAK =================
if($tipe=="rusak"){
$nama = $_POST['nama'];
$ket = $_POST['keterangan'];
$lat = $_POST['lat'];
$lng = $_POST['lng'];
$sql = "INSERT INTO rusak (nama,keterangan,lat,lng)
VALUES (?,?,?,?)";
$stmt = $conn->prepare($sql);
$stmt->bind_param("ssdd",$nama,$ket,$lat,$lng);
if($stmt->execute()){
echo "success";
}else{
echo "Error: ".$stmt->error;
}
}
?>
+130
View File
@@ -0,0 +1,130 @@
-- phpMyAdmin SQL Dump
-- version 5.2.1
-- https://www.phpmyadmin.net/
--
-- Host: 127.0.0.1
-- Generation Time: Jun 07, 2026 at 08:40 AM
-- Server version: 10.4.32-MariaDB
-- PHP Version: 8.2.12
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
START TRANSACTION;
SET time_zone = "+00:00";
CREATE DATABASE IF NOT EXISTS `webgis2` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
USE `webgis2`;
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
--
-- Database: `webgis2`
--
-- --------------------------------------------------------
--
-- Table structure for table `jalan`
--
CREATE TABLE `jalan` (
`id` int(11) NOT NULL,
`nama_jalan` varchar(100) DEFAULT NULL,
`status` enum('nasional','provinsi','kabupaten') DEFAULT NULL,
`panjang` double DEFAULT NULL,
`geom` longtext DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- --------------------------------------------------------
--
-- Table structure for table `rusak`
--
CREATE TABLE `rusak` (
`id` int(11) NOT NULL,
`nama` varchar(100) DEFAULT NULL,
`keterangan` text DEFAULT NULL,
`lat` double DEFAULT NULL,
`lng` double DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
--
-- Dumping data for table `rusak`
--
INSERT INTO `rusak` (`id`, `nama`, `keterangan`, `lat`, `lng`) VALUES
(1, 'Jalan Muhammad Sohor', 'Jalan rusak', -0.04526554995370654, 109.33220118916333);
-- --------------------------------------------------------
--
-- Table structure for table `tanah`
--
CREATE TABLE `tanah` (
`id` int(11) NOT NULL,
`nama_pemilik` varchar(100) DEFAULT NULL,
`status` enum('SHM','HGB','HGU','HP') DEFAULT NULL,
`luas` double DEFAULT NULL,
`geom` longtext DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
--
-- Dumping data for table `tanah`
--
INSERT INTO `tanah` (`id`, `nama_pemilik`, `status`, `luas`, `geom`) VALUES
(1, 'lutpi', 'SHM', 301239.82019077707, '{\"type\":\"Feature\",\"properties\":{},\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[[[109.333446,-0.047334],[109.337673,-0.043859],[109.338831,-0.042936],[109.340998,-0.045597],[109.340355,-0.046626],[109.339389,-0.04727],[109.338509,-0.048343],[109.337501,-0.048901],[109.335913,-0.049287],[109.333446,-0.047334]]]}}');
--
-- Indexes for dumped tables
--
--
-- Indexes for table `jalan`
--
ALTER TABLE `jalan`
ADD PRIMARY KEY (`id`);
--
-- Indexes for table `rusak`
--
ALTER TABLE `rusak`
ADD PRIMARY KEY (`id`);
--
-- Indexes for table `tanah`
--
ALTER TABLE `tanah`
ADD PRIMARY KEY (`id`);
--
-- AUTO_INCREMENT for dumped tables
--
--
-- AUTO_INCREMENT for table `jalan`
--
ALTER TABLE `jalan`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
--
-- AUTO_INCREMENT for table `rusak`
--
ALTER TABLE `rusak`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;
--
-- AUTO_INCREMENT for table `tanah`
--
ALTER TABLE `tanah`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;
COMMIT;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
+8
View File
File diff suppressed because one or more lines are too long
+166
View File
@@ -0,0 +1,166 @@
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Peta Choropleth Pontianak</title>
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css"/>
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
<style>
html, body {
height: 100%;
margin: 0;
}
#map {
width: 100%;
height: 100vh;
}
.info {
padding: 6px 8px;
font: 14px Arial;
background: rgba(255,255,255,0.9);
box-shadow: 0 0 15px rgba(0,0,0,0.2);
border-radius: 5px;
}
.legend {
line-height: 18px;
color: #555;
}
.legend i {
width: 18px;
height: 18px;
float: left;
margin-right: 8px;
opacity: 0.7;
}
</style>
</head>
<body>
<div id="map"></div>
<!-- DATA PONTIANAK -->
<script src="pontianak.js"></script>
<script>
// ================= MAP =================
const map = L.map('map').setView([-0.0263, 109.3424], 12);
L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {
maxZoom: 19
}).addTo(map);
// ================= INFO =================
const info = L.control();
info.onAdd = function () {
this._div = L.DomUtil.create('div', 'info');
this.update();
return this._div;
};
info.update = function (props) {
const isi = props
? `<b>${props.name}</b><br>${props.density} jiwa/km²`
: 'Arahkan kursor ke wilayah';
this._div.innerHTML = `<h4>Kepadatan Penduduk Pontianak</h4>${isi}`;
};
info.addTo(map);
// ================= WARNA =================
function getColor(d) {
return d > 10000 ? '#800026' :
d > 8000 ? '#BD0026' :
d > 6000 ? '#E31A1C' :
d > 4000 ? '#FC4E2A' :
d > 2000 ? '#FD8D3C' :
d > 1000 ? '#FEB24C' :
d > 500 ? '#FED976' :
'#FFEDA0';
}
// ================= STYLE =================
function style(feature) {
return {
weight: 2,
opacity: 1,
color: 'white',
dashArray: '3',
fillOpacity: 0.7,
fillColor: getColor(feature.properties.density)
};
}
// ================= INTERAKSI =================
function highlightFeature(e) {
const layer = e.target;
layer.setStyle({
weight: 5,
color: '#666',
dashArray: '',
fillOpacity: 0.7
});
layer.bringToFront();
info.update(layer.feature.properties);
}
function resetHighlight(e) {
geojson.resetStyle(e.target);
info.update();
}
function zoomToFeature(e) {
map.fitBounds(e.target.getBounds());
}
function onEachFeature(feature, layer) {
layer.on({
mouseover: highlightFeature,
mouseout: resetHighlight,
click: zoomToFeature
});
}
// ================= GEOJSON =================
const geojson = L.geoJson(pontianakData, {
style: style,
onEachFeature: onEachFeature
}).addTo(map);
// ================= LEGEND =================
const legend = L.control({position: 'bottomright'});
legend.onAdd = function () {
const div = L.DomUtil.create('div', 'info legend');
const grades = [0, 500, 1000, 2000, 4000, 6000, 8000, 10000];
let labels = [];
for (let i = 0; i < grades.length; i++) {
let from = grades[i];
let to = grades[i + 1];
labels.push(
`<i style="background:${getColor(from + 1)}"></i> ${from}${to ? '' + to : '+'}`
);
}
div.innerHTML = labels.join('<br>');
return div;
};
legend.addTo(map);
</script>
</body>
</html>
+166
View File
@@ -0,0 +1,166 @@
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Peta Choropleth Pontianak</title>
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css"/>
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
<style>
html, body {
height: 100%;
margin: 0;
}
#map {
width: 100%;
height: 100vh;
}
.info {
padding: 6px 8px;
font: 14px Arial;
background: rgba(255,255,255,0.9);
box-shadow: 0 0 15px rgba(0,0,0,0.2);
border-radius: 5px;
}
.legend {
line-height: 18px;
color: #555;
}
.legend i {
width: 18px;
height: 18px;
float: left;
margin-right: 8px;
opacity: 0.7;
}
</style>
</head>
<body>
<div id="map"></div>
<!-- DATA PONTIANAK -->
<script src="pontianak.js"></script>
<script>
// ================= MAP =================
const map = L.map('map').setView([-0.0263, 109.3424], 12);
L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {
maxZoom: 19
}).addTo(map);
// ================= INFO =================
const info = L.control();
info.onAdd = function () {
this._div = L.DomUtil.create('div', 'info');
this.update();
return this._div;
};
info.update = function (props) {
const isi = props
? `<b>${props.name}</b><br>${props.density} jiwa/km²`
: 'Arahkan kursor ke wilayah';
this._div.innerHTML = `<h4>Kepadatan Penduduk Pontianak</h4>${isi}`;
};
info.addTo(map);
// ================= WARNA =================
function getColor(d) {
return d > 10000 ? '#800026' :
d > 8000 ? '#BD0026' :
d > 6000 ? '#E31A1C' :
d > 4000 ? '#FC4E2A' :
d > 2000 ? '#FD8D3C' :
d > 1000 ? '#FEB24C' :
d > 500 ? '#FED976' :
'#FFEDA0';
}
// ================= STYLE =================
function style(feature) {
return {
weight: 2,
opacity: 1,
color: 'white',
dashArray: '3',
fillOpacity: 0.7,
fillColor: getColor(feature.properties.density)
};
}
// ================= INTERAKSI =================
function highlightFeature(e) {
const layer = e.target;
layer.setStyle({
weight: 5,
color: '#666',
dashArray: '',
fillOpacity: 0.7
});
layer.bringToFront();
info.update(layer.feature.properties);
}
function resetHighlight(e) {
geojson.resetStyle(e.target);
info.update();
}
function zoomToFeature(e) {
map.fitBounds(e.target.getBounds());
}
function onEachFeature(feature, layer) {
layer.on({
mouseover: highlightFeature,
mouseout: resetHighlight,
click: zoomToFeature
});
}
// ================= GEOJSON =================
const geojson = L.geoJson(pontianakData, {
style: style,
onEachFeature: onEachFeature
}).addTo(map);
// ================= LEGEND =================
const legend = L.control({position: 'bottomright'});
legend.onAdd = function () {
const div = L.DomUtil.create('div', 'info legend');
const grades = [0, 500, 1000, 2000, 4000, 6000, 8000, 10000];
let labels = [];
for (let i = 0; i < grades.length; i++) {
let from = grades[i];
let to = grades[i + 1];
labels.push(
`<i style="background:${getColor(from + 1)}"></i> ${from}${to ? '' + to : '+'}`
);
}
div.innerHTML = labels.join('<br>');
return div;
};
legend.addTo(map);
</script>
</body>
</html>
+1
View File
File diff suppressed because one or more lines are too long
+54
View File
File diff suppressed because one or more lines are too long
+12
View File
@@ -0,0 +1,12 @@
<?php
include 'koneksi.php';
$data = [];
$result = $conn->query("SELECT * FROM spbu");
while($row = $result->fetch_assoc()){
$data[] = $row;
}
echo json_encode($data);
?>
+13
View File
@@ -0,0 +1,13 @@
<?php
include 'koneksi.php';
$result = $conn->query("SELECT * FROM spbu");
$data = [];
while($row = $result->fetch_assoc()){
$data[] = $row;
}
echo json_encode($data);
?>
+19
View File
@@ -0,0 +1,19 @@
<?php
include 'koneksi.php';
$id = $_POST['id'];
$nama = $_POST['nama_spbu'];
$wa = $_POST['no_wa'];
$status = $_POST['status'];
$buka24 = $_POST['buka_24jam'];
$sql = "UPDATE spbu
SET nama_spbu='$nama', no_wa='$wa', status='$status', buka_24jam='$buka24'
WHERE id='$id'";
if ($conn->query($sql)) {
echo "success";
} else {
echo "error: " . $conn->error;
}
?>
+13
View File
@@ -0,0 +1,13 @@
<?php
include 'koneksi.php';
$id = $_POST['id'];
$sql = "DELETE FROM spbu WHERE id='$id'";
if ($conn->query($sql)) {
echo "success";
} else {
echo "error: " . $conn->error;
}
?>
+13
View File
@@ -0,0 +1,13 @@
<?php
include 'koneksi.php';
$id = $_POST['id'];
$sql = "DELETE FROM spbu WHERE id='$id'";
if ($conn->query($sql)) {
echo "success";
} else {
echo "error: " . $conn->error;
}
?>
+80
View File
@@ -0,0 +1,80 @@
<!DOCTYPE html>
<html lang="en">
<head>
<base target="_top">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Quick Start - Leaflet</title>
<link rel="shortcut icon" type="image/x-icon" href="docs/images/favicon.ico" />
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" integrity="sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY=" crossorigin=""/>
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js" integrity="sha256-20nQCchB9co0qIjJZRGuk2/Z9VM+kNiyxNV1lvTlZBo=" crossorigin=""></script>
<style>
html, body {
height: 100%;
margin: 0;
}
.leaflet-container {
height: 400px;
width: 600px;
max-width: 100%;
max-height: 100%;
}
</style>
</head>
<body>
<div id="map" style="width: 600px; height: 400px;"></div>
<script>
const map = L.map('map').setView([-0.0552679922693441, 109.34961134769004], 13);
const tiles = L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {
maxZoom: 19,
attribution: '&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>'
}).addTo(map);
const marker = L.marker([-0.0552679922693441, 109.34961134769004]).addTo(map)
.bindPopup('<b>Hello world!</b><br />I am a popup.').openPopup();
const circle = L.circle([-0.056, 109.35], {
color: 'red',
fillColor: '#f03',
fillOpacity: 0.5,
radius: 500
}).addTo(map).bindPopup('I am a circle.');
const polygon = L.polygon([
[-0.054, 109.34],
[-0.057, 109.36],
[-0.052, 109.355]
]).addTo(map).bindPopup('I am a polygon.');
const popup = L.popup()
.setLatLng([51.513, -0.09])
.setContent('I am a standalone popup.')
.openOn(map);
function onMapClick(e) {
popup
.setLatLng(e.latlng)
.setContent(`You clicked the map at ${e.latlng.toString()}`)
.openOn(map);
}
map.on('click', onMapClick);
</script>
</body>
</html>
+252
View File
@@ -0,0 +1,252 @@
<!DOCTYPE html>
<html>
<head>
<title>Peta SPBU</title>
<link rel="stylesheet" href="https://unpkg.com/leaflet/dist/leaflet.css"/>
<script src="https://unpkg.com/leaflet/dist/leaflet.js"></script>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<style>
body { margin: 0; padding: 0; }
#map { height: 100vh; }
/* Custom styling untuk Layers Control */
.leaflet-control-layers {
border-radius: 8px !important;
box-shadow: 0 2px 10px rgba(0,0,0,0.2) !important;
}
.leaflet-control-layers-expanded {
padding: 10px 14px !important;
font-size: 13px !important;
}
</style>
</head>
<body>
<div id="map"></div>
<script>
// ================= MAP =================
var map = L.map('map').setView([-0.055353822919599796, 109.3495577035227], 15);
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '&copy; OpenStreetMap contributors'
}).addTo(map);
// ================= ICON =================
// SPBU 24 Jam - Hijau
var icon24Jam = L.icon({
iconUrl: 'https://maps.google.com/mapfiles/ms/icons/green-dot.png',
iconSize: [32, 32],
iconAnchor: [16, 32],
popupAnchor: [0, -32]
});
// SPBU Tidak 24 Jam - Merah
var iconTidak24Jam = L.icon({
iconUrl: 'https://maps.google.com/mapfiles/ms/icons/red-dot.png',
iconSize: [32, 32],
iconAnchor: [16, 32],
popupAnchor: [0, -32]
});
// ================= LAYER GROUPS =================
var layer24Jam = L.layerGroup().addTo(map); // tampil by default
var layerTidak24Jam = L.layerGroup().addTo(map); // tampil by default
// ================= LAYERS CONTROL =================
var overlayMaps = {
"🟢 SPBU Buka 24 Jam" : layer24Jam,
"🔴 SPBU Tidak Buka 24 Jam" : layerTidak24Jam
};
L.control.layers(null, overlayMaps, {
collapsed: false, // langsung tampil (tidak perlu klik expand)
position: 'topright'
}).addTo(map);
// ================= LOAD DATA =================
function loadData() {
// Bersihkan layer sebelum reload
layer24Jam.clearLayers();
layerTidak24Jam.clearLayers();
$.getJSON("ambil.php", function(data) {
data.forEach(function(d) {
var adalah24Jam = (d.buka_24jam === "yes");
var icon = adalah24Jam ? icon24Jam : iconTidak24Jam;
var targetLayer = adalah24Jam ? layer24Jam : layerTidak24Jam;
var marker = L.marker([d.lat, d.lng], {
icon: icon,
draggable: true
}).addTo(targetLayer);
// Simpan id & jenis di marker
marker.spbu_id = d.id;
marker.spbu_24jam = d.buka_24jam;
// ---- Popup edit + hapus ----
var labelStatus = adalah24Jam
? '<span style="color:green;font-weight:bold;">✅ Buka 24 Jam</span>'
: '<span style="color:red;font-weight:bold;">🔴 Tidak Buka 24 Jam</span>';
var popup = `
<form onsubmit="updateData(event, ${d.id})">
<b>Edit SPBU</b><br>
<small>${labelStatus}</small><br><br>
Nama:<br>
<input type="text" name="nama_spbu" value="${d.nama_spbu}" required style="width:180px"><br><br>
WA:<br>
<input type="text" name="no_wa" value="${d.no_wa}" required style="width:180px"><br><br>
Status Operasional:<br>
<select name="status">
<option value="yes" ${d.status=="yes"?"selected":""}>Beroperasi (Yes)</option>
<option value="no" ${d.status=="no" ?"selected":""}>Tidak Beroperasi (No)</option>
</select><br><br>
Jenis SPBU:<br>
<select name="buka_24jam">
<option value="yes" ${d.buka_24jam=="yes"?"selected":""}>Buka 24 Jam</option>
<option value="no" ${d.buka_24jam=="no" ?"selected":""}>Tidak Buka 24 Jam</option>
</select><br><br>
<button type="submit"
style="background:#2196F3;color:#fff;border:none;padding:6px 12px;border-radius:4px;cursor:pointer;margin-right:6px">
Update
</button>
<button type="button" onclick="hapusData(${d.id})"
style="background:#f44336;color:#fff;border:none;padding:6px 12px;border-radius:4px;cursor:pointer">
Hapus
</button>
</form>
`;
marker.bindPopup(popup);
// ---- Drag → update koordinat ----
marker.on('dragend', function() {
var pos = marker.getLatLng();
$.post("update.php", {
id: d.id,
lat: pos.lat,
lng: pos.lng
});
});
});
});
}
loadData();
// ================= TAMBAH DATA (klik peta) =================
map.on('click', function(e) {
var form = `
<form id="formSPBU">
<b>Tambah SPBU</b><br><br>
Nama:<br>
<input type="text" name="nama_spbu" required style="width:180px"><br><br>
WA:<br>
<input type="text" name="no_wa" required style="width:180px"><br><br>
Status Operasional:<br>
<select name="status">
<option value="yes">Beroperasi (Yes)</option>
<option value="no">Tidak Beroperasi (No)</option>
</select><br><br>
Jenis SPBU:<br>
<select name="buka_24jam">
<option value="yes">Buka 24 Jam</option>
<option value="no">Tidak Buka 24 Jam</option>
</select><br><br>
<input type="hidden" name="lat" value="${e.latlng.lat}">
<input type="hidden" name="lng" value="${e.latlng.lng}">
<button type="submit"
style="background:#4CAF50;color:#fff;border:none;padding:6px 14px;border-radius:4px;cursor:pointer">
Simpan
</button>
</form>
`;
L.popup().setLatLng(e.latlng).setContent(form).openOn(map);
});
// ================= SIMPAN =================
$(document).on('submit', '#formSPBU', function(e) {
e.preventDefault();
var formData = $(this).serialize();
$.post("simpan.php", formData, function(res) {
if (res.trim() === "success") {
alert("✅ Data berhasil disimpan");
map.closePopup();
loadData(); // reload marker tanpa refresh halaman
} else {
alert("❌ ERROR: " + res);
}
});
});
// ================= UPDATE DATA =================
function updateData(e, id) {
e.preventDefault();
var form = e.target;
var data = $(form).serialize() + "&id=" + id;
$.post("edit.php", data, function(res) {
if (res.trim() === "success") {
alert("✅ Data diupdate");
map.closePopup();
loadData(); // reload marker supaya ikon/layer langsung berubah
} else {
alert("" + res);
}
});
}
// ================= HAPUS =================
function hapusData(id) {
if (confirm("Yakin hapus data ini?")) {
$.post("hapus.php", { id: id }, function(res) {
if (res.trim() === "success") {
map.closePopup();
loadData();
alert("✅ Data dihapus");
} else {
alert("❌ Gagal: " + res);
}
});
}
}
</script>
</body>
</html>
+15
View File
@@ -0,0 +1,15 @@
<?php
$host = getenv('DB_HOST') ?: 'localhost';
$user = getenv('DB_USER') ?: 'root';
$pass = getenv('DB_PASSWORD');
$pass = ($pass === false) ? '' : $pass;
$db = getenv('DB_NAME') ?: 'spbu_db';
$conn = new mysqli($host, $user, $pass, $db);
if ($conn->connect_error) {
die("Koneksi database gagal: " . $conn->connect_error);
}
$conn->set_charset("utf8mb4");
?>
+19
View File
@@ -0,0 +1,19 @@
<?php
include 'koneksi.php';
$nama = $_POST['nama_spbu'];
$wa = $_POST['no_wa'];
$status = $_POST['status'];
$buka24 = $_POST['buka_24jam'];
$lat = $_POST['lat'];
$lng = $_POST['lng'];
$sql = "INSERT INTO spbu (nama_spbu, no_wa, status, buka_24jam, lat, lng)
VALUES ('$nama', '$wa', '$status', '$buka24', '$lat', '$lng')";
if ($conn->query($sql)) {
echo "success";
} else {
echo "error: " . $conn->error;
}
?>
+24
View File
@@ -0,0 +1,24 @@
<?php
include 'koneksi.php';
// DEBUG: cek apakah data terkirim
if (!isset($_POST['nama_spbu'])) {
echo "error: data tidak masuk";
exit;
}
$nama = $_POST['nama_spbu'];
$wa = $_POST['no_wa'];
$status = $_POST['status'];
$lat = $_POST['lat'];
$lng = $_POST['lng'];
$sql = "INSERT INTO spbu (nama_spbu, no_wa, status, lat, lng)
VALUES ('$nama', '$wa', '$status', '$lat', '$lng')";
if ($conn->query($sql)) {
echo "success";
} else {
echo "error: " . $conn->error; // 🔥 ini penting
}
?>
+77
View File
@@ -0,0 +1,77 @@
-- phpMyAdmin SQL Dump
-- version 5.2.1
-- https://www.phpmyadmin.net/
--
-- Host: 127.0.0.1
-- Generation Time: Jun 07, 2026 at 08:36 AM
-- Server version: 10.4.32-MariaDB
-- PHP Version: 8.2.12
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
START TRANSACTION;
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
--
-- Database: `spbu_db`
--
CREATE DATABASE IF NOT EXISTS `spbu_db` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
USE `spbu_db`;
-- --------------------------------------------------------
--
-- Table structure for table `spbu`
--
CREATE TABLE `spbu` (
`id` int(11) NOT NULL,
`nama_spbu` varchar(100) NOT NULL,
`no_wa` varchar(20) NOT NULL,
`status` enum('yes','no') NOT NULL,
`lat` double NOT NULL,
`lng` double NOT NULL,
`buka_24jam` enum('yes','no') DEFAULT 'no'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
--
-- Dumping data for table `spbu`
--
INSERT INTO `spbu` (`id`, `nama_spbu`, `no_wa`, `status`, `lat`, `lng`, `buka_24jam`) VALUES
(1, 'SPBU Wahidin', '12345678', 'yes', -0.05501782621888551, 109.34941275816585, 'no'),
(2, 'SPBU Ayani', '12323534', 'yes', -0.061969576295016156, 109.35348997289081, 'no'),
(3, 'SPBU Wahidin', '12345678', 'yes', -0.05553003299958369, 109.34949398529896, 'no'),
(4, 'SPBU Wahidin', '12345678', 'yes', -0.05518676231453869, 109.34936525640107, 'no'),
(5, 'SPBU Ayani', '12345678', 'no', -0.05385658839135921, 109.35633076365197, 'no');
--
-- Indexes for dumped tables
--
--
-- Indexes for table `spbu`
--
ALTER TABLE `spbu`
ADD PRIMARY KEY (`id`);
--
-- AUTO_INCREMENT for dumped tables
--
--
-- AUTO_INCREMENT for table `spbu`
--
ALTER TABLE `spbu`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6;
COMMIT;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
+15
View File
@@ -0,0 +1,15 @@
<?php
include 'koneksi.php';
$id = $_POST['id'];
$lat = $_POST['lat'];
$lng = $_POST['lng'];
$sql = "UPDATE spbu SET lat='$lat', lng='$lng' WHERE id='$id'";
if ($conn->query($sql)) {
echo "success";
} else {
echo "error: " . $conn->error;
}
?>
+51
View File
@@ -0,0 +1,51 @@
<?php
include 'koneksi.php';
$data = [];
// ===== RUMAH IBADAH =====
$q = $conn->query("SELECT *, 'ibadah' AS tipe FROM rumah_ibadah");
while ($r = $q->fetch_assoc()) {
$data[] = $r;
}
// ===== PENDUDUK (dengan umur otomatis) =====
$q2 = $conn->query("
SELECT
p.id, p.nik, p.nama, p.jenis_kelamin,
TIMESTAMPDIFF(YEAR, p.tanggal_lahir, CURDATE()) AS umur,
p.status_keluarga, p.status_perkawinan, p.status_hidup,
p.alamat, p.lat, p.lng, p.no_hp,
p.pekerjaan, p.penghasilan, p.status_ekonomi,
p.pendidikan_terakhir, p.status_pendidikan,
p.keluarga_id, p.rumah_ibadah_id,
k.no_kk,
r.nama AS nama_ibadah,
r.jenis AS jenis_ibadah,
(SELECT COUNT(*) FROM histori_bantuan hb WHERE hb.penduduk_id = p.id AND hb.status='selesai') AS total_bantuan,
'penduduk' AS tipe
FROM penduduk p
LEFT JOIN keluarga k ON p.keluarga_id = k.id
LEFT JOIN rumah_ibadah r ON p.rumah_ibadah_id = r.id
WHERE p.status_hidup = 'hidup'
");
while ($r = $q2->fetch_assoc()) {
$r['penghasilan'] = (float)$r['penghasilan'];
$r['total_bantuan'] = (int)$r['total_bantuan'];
$r['umur'] = (int)$r['umur'];
$data[] = $r;
}
// ===== LAPORAN =====
$q3 = $conn->query("
SELECT l.*, p.nama AS nama_penduduk, 'laporan' AS tipe
FROM laporan l
LEFT JOIN penduduk p ON l.penduduk_id = p.id
WHERE l.lat IS NOT NULL AND l.lng IS NOT NULL
");
while ($r = $q3->fetch_assoc()) {
$data[] = $r;
}
header('Content-Type: application/json');
echo json_encode($data, JSON_UNESCAPED_UNICODE);
+57
View File
@@ -0,0 +1,57 @@
<?php
include 'koneksi.php';
header('Content-Type: application/json');
$action = $_GET['action'] ?? $_POST['action'] ?? 'list';
// ===== LIST PESAN =====
if ($action === 'list') {
$limit = (int)($_GET['limit'] ?? 50);
$q = $conn->query("
SELECT c.id, c.pesan, c.dibaca, c.created_at,
u.nama_lengkap AS dari, u.username,
t.nama_lengkap AS ke
FROM chat c
JOIN user u ON c.from_user = u.id
LEFT JOIN user t ON c.to_user = t.id
ORDER BY c.created_at DESC
LIMIT $limit
");
$rows = [];
while ($r = $q->fetch_assoc()) $rows[] = $r;
echo json_encode(array_reverse($rows), JSON_UNESCAPED_UNICODE);
}
// ===== KIRIM PESAN =====
elseif ($action === 'kirim') {
$from = (int)$_POST['from_user'];
$to = ($_POST['to_user'] ?? '') ? (int)$_POST['to_user'] : null;
$pesan = trim($_POST['pesan'] ?? '');
if (!$from || !$pesan) {
echo json_encode(['status'=>'error','msg'=>'Data tidak lengkap']);
exit;
}
$stmt = $conn->prepare("INSERT INTO chat (from_user, to_user, pesan) VALUES (?,?,?)");
$stmt->bind_param("iis", $from, $to, $pesan);
$stmt->execute()
? print json_encode(['status'=>'success','id'=>$conn->insert_id])
: print json_encode(['status'=>'error','msg'=>$stmt->error]);
// Log aktivitas
$log = $conn->prepare("INSERT INTO log_aktivitas (user_id, aksi, tabel, record_id, detail) VALUES (?,?,?,?,?)");
$aksi = 'kirim_chat'; $tbl = 'chat'; $rid = $conn->insert_id;
$det = "Pesan: ".substr($pesan,0,80);
$log->bind_param("issis", $from, $aksi, $tbl, $rid, $det);
$log->execute();
}
// ===== DAFTAR PENGURUS =====
elseif ($action === 'users') {
$q = $conn->query("SELECT id, username, nama_lengkap, role_id FROM user WHERE aktif=1 ORDER BY nama_lengkap");
$rows = [];
while ($r = $q->fetch_assoc()) $rows[] = $r;
echo json_encode($rows, JSON_UNESCAPED_UNICODE);
}
?>
+35
View File
@@ -0,0 +1,35 @@
<?php
include 'koneksi.php';
header('Content-Type: application/json');
$stats = [];
// Total penduduk hidup
$r = $conn->query("SELECT COUNT(*) AS total, SUM(status_ekonomi='miskin') AS miskin, SUM(status_ekonomi='rentan') AS rentan, SUM(status_ekonomi='mampu') AS mampu FROM penduduk WHERE status_hidup='hidup'");
$stats['penduduk'] = $r->fetch_assoc();
// Rumah ibadah
$r2 = $conn->query("SELECT COUNT(*) AS total FROM rumah_ibadah");
$stats['rumah_ibadah'] = $r2->fetch_assoc();
// Laporan pending / darurat
$r3 = $conn->query("SELECT COUNT(*) AS total, SUM(urgensi='darurat') AS darurat, SUM(status='pending') AS pending FROM laporan");
$stats['laporan'] = $r3->fetch_assoc();
// Bantuan bulan ini
$r4 = $conn->query("SELECT COUNT(*) AS total, SUM(status='selesai') AS selesai FROM histori_bantuan WHERE MONTH(tanggal)=MONTH(CURDATE()) AND YEAR(tanggal)=YEAR(CURDATE())");
$stats['bantuan_bulan_ini'] = $r4->fetch_assoc();
// Belum pernah dibantu (miskin)
$r5 = $conn->query("SELECT COUNT(*) AS total FROM penduduk p WHERE p.status_ekonomi='miskin' AND p.status_hidup='hidup' AND NOT EXISTS (SELECT 1 FROM histori_bantuan h WHERE h.penduduk_id=p.id AND h.status='selesai')");
$stats['miskin_belum_dibantu'] = $r5->fetch_assoc();
// Sebaran per rumah ibadah
$r6 = $conn->query("SELECT ri.nama, ri.jenis, COUNT(p.id) AS jumlah_penduduk, SUM(p.status_ekonomi='miskin') AS miskin FROM rumah_ibadah ri LEFT JOIN penduduk p ON p.rumah_ibadah_id=ri.id AND p.status_hidup='hidup' GROUP BY ri.id");
$stats['per_rumah_ibadah'] = $r6->fetch_all(MYSQLI_ASSOC);
// Tren bantuan 6 bulan terakhir
$r7 = $conn->query("SELECT DATE_FORMAT(tanggal,'%Y-%m') AS bulan, COUNT(*) AS total FROM histori_bantuan WHERE tanggal >= DATE_SUB(CURDATE(), INTERVAL 6 MONTH) GROUP BY bulan ORDER BY bulan");
$stats['tren_bantuan'] = $r7->fetch_all(MYSQLI_ASSOC);
echo json_encode($stats, JSON_UNESCAPED_UNICODE);
+72
View File
@@ -0,0 +1,72 @@
<?php
include 'koneksi.php';
$id = (int)$_GET['id'];
$tipe = $_GET['tipe'] ?? '';
header('Content-Type: application/json');
if ($tipe === 'ibadah') {
$stmt = $conn->prepare("SELECT ri.*, u.nama_lengkap AS pengurus FROM rumah_ibadah ri LEFT JOIN user u ON ri.user_id=u.id WHERE ri.id=?");
$stmt->bind_param("i", $id);
$stmt->execute();
$data = $stmt->get_result()->fetch_assoc();
// Jumlah penduduk terdaftar
$s2 = $conn->prepare("SELECT COUNT(*) AS total, SUM(status_ekonomi='miskin') AS miskin, SUM(status_ekonomi='rentan') AS rentan FROM penduduk WHERE rumah_ibadah_id=? AND status_hidup='hidup'");
$s2->bind_param("i", $id);
$s2->execute();
$data['statistik'] = $s2->get_result()->fetch_assoc();
echo json_encode($data, JSON_UNESCAPED_UNICODE);
} elseif ($tipe === 'penduduk') {
$stmt = $conn->prepare("
SELECT p.*,
TIMESTAMPDIFF(YEAR, p.tanggal_lahir, CURDATE()) AS umur,
k.no_kk, r.nama AS nama_ibadah
FROM penduduk p
LEFT JOIN keluarga k ON p.keluarga_id = k.id
LEFT JOIN rumah_ibadah r ON p.rumah_ibadah_id = r.id
WHERE p.id=?
");
$stmt->bind_param("i", $id);
$stmt->execute();
$data = $stmt->get_result()->fetch_assoc();
// Anggota keluarga (sesama KK)
if ($data['keluarga_id']) {
$s2 = $conn->prepare("SELECT id, nama, jenis_kelamin, TIMESTAMPDIFF(YEAR, tanggal_lahir, CURDATE()) AS umur, status_keluarga FROM penduduk WHERE keluarga_id=? AND id!=? AND status_hidup='hidup'");
$s2->bind_param("ii", $data['keluarga_id'], $id);
$s2->execute();
$data['anggota_keluarga'] = $s2->get_result()->fetch_all(MYSQLI_ASSOC);
} else {
$data['anggota_keluarga'] = [];
}
// Histori bantuan
$s3 = $conn->prepare("
SELECT hb.*, jb.nama AS nama_bantuan, jb.kategori
FROM histori_bantuan hb
JOIN jenis_bantuan jb ON hb.jenis_bantuan_id = jb.id
WHERE hb.penduduk_id=?
ORDER BY hb.tanggal DESC
");
$s3->bind_param("i", $id);
$s3->execute();
$data['histori_bantuan'] = $s3->get_result()->fetch_all(MYSQLI_ASSOC);
// Pelatihan
$s4 = $conn->prepare("SELECT * FROM pelatihan WHERE penduduk_id=?");
$s4->bind_param("i", $id);
$s4->execute();
$data['pelatihan'] = $s4->get_result()->fetch_all(MYSQLI_ASSOC);
echo json_encode($data, JSON_UNESCAPED_UNICODE);
} elseif ($tipe === 'laporan') {
$stmt = $conn->prepare("SELECT l.*, p.nama AS nama_penduduk FROM laporan l LEFT JOIN penduduk p ON l.penduduk_id=p.id WHERE l.id=?");
$stmt->bind_param("i", $id);
$stmt->execute();
echo json_encode($stmt->get_result()->fetch_assoc(), JSON_UNESCAPED_UNICODE);
}
+52
View File
@@ -0,0 +1,52 @@
<?php
include 'koneksi.php';
header('Content-Type: application/json');
$id = (int)$_POST['id'];
$tipe = $_POST['tipe'] ?? '';
if ($tipe === 'ibadah') {
$stmt = $conn->prepare("UPDATE rumah_ibadah SET nama=?,jenis=?,kontak=?,alamat=?,radius=? WHERE id=?");
$stmt->bind_param("ssssdi",
$_POST['nama'], $_POST['jenis'], $_POST['kontak'],
$_POST['alamat'], (float)$_POST['radius'], $id
);
$stmt->execute()
? print json_encode(["status" => "success"])
: print json_encode(["status" => "error", "msg" => $stmt->error]);
} elseif ($tipe === 'penduduk') {
$stmt = $conn->prepare("UPDATE penduduk SET nama=?,jenis_kelamin=?,tanggal_lahir=?,status_keluarga=?,status_perkawinan=?,status_hidup=?,alamat=?,no_hp=?,pekerjaan=?,penghasilan=?,status_ekonomi=?,pendidikan_terakhir=?,status_pendidikan=? WHERE id=?");
$stmt->bind_param("sssssssssdsssi",
$_POST['nama'],
$_POST['jenis_kelamin'],
$_POST['tanggal_lahir'],
$_POST['status_keluarga'],
$_POST['status_perkawinan'],
$_POST['status_hidup'],
$_POST['alamat'],
$_POST['no_hp'],
$_POST['pekerjaan'],
(float)$_POST['penghasilan'],
$_POST['status_ekonomi'],
$_POST['pendidikan_terakhir'],
$_POST['status_pendidikan'],
$id
);
$stmt->execute()
? print json_encode(["status" => "success"])
: print json_encode(["status" => "error", "msg" => $stmt->error]);
} elseif ($tipe === 'laporan') {
$stmt = $conn->prepare("UPDATE laporan SET status=?,ditangani_oleh=? WHERE id=?");
$handler = ($_POST['ditangani_oleh'] ?? '') ? (int)$_POST['ditangani_oleh'] : null;
$stmt->bind_param("sii", $_POST['status'], $handler, $id);
$stmt->execute()
? print json_encode(["status" => "success"])
: print json_encode(["status" => "error", "msg" => $stmt->error]);
} else {
http_response_code(400);
echo json_encode(["status" => "error", "msg" => "Tipe tidak dikenal"]);
}
+39
View File
@@ -0,0 +1,39 @@
<?php
include 'koneksi.php';
header('Content-Type: application/json');
$id = (int)$_POST['id'];
$tipe = $_POST['tipe'] ?? '';
if ($tipe === 'ibadah') {
$stmt = $conn->prepare("DELETE FROM rumah_ibadah WHERE id=?");
$stmt->bind_param("i", $id);
$stmt->execute()
? print json_encode(["status" => "success"])
: print json_encode(["status" => "error", "msg" => $stmt->error]);
} elseif ($tipe === 'penduduk') {
// Hapus histori & pelatihan dulu (FK)
foreach (['histori_bantuan', 'pelatihan'] as $tbl) {
$s = $conn->prepare("DELETE FROM $tbl WHERE penduduk_id=?");
$s->bind_param("i", $id);
$s->execute();
}
$stmt = $conn->prepare("DELETE FROM penduduk WHERE id=?");
$stmt->bind_param("i", $id);
$stmt->execute()
? print json_encode(["status" => "success"])
: print json_encode(["status" => "error", "msg" => $stmt->error]);
} elseif ($tipe === 'laporan') {
$stmt = $conn->prepare("DELETE FROM laporan WHERE id=?");
$stmt->bind_param("i", $id);
$stmt->execute()
? print json_encode(["status" => "success"])
: print json_encode(["status" => "error", "msg" => $stmt->error]);
} else {
http_response_code(400);
echo json_encode(["status" => "error", "msg" => "Tipe tidak dikenal"]);
}
+2286
View File
File diff suppressed because it is too large Load Diff
+15
View File
@@ -0,0 +1,15 @@
<?php
$host = getenv('DB_HOST') ?: 'localhost';
$user = getenv('DB_USER') ?: 'root';
$pass = getenv('DB_PASSWORD');
$pass = ($pass === false) ? '' : $pass;
$db = getenv('DB_NAME') ?: 'webgis_uas';
$conn = new mysqli($host, $user, $pass, $db);
if ($conn->connect_error) {
http_response_code(500);
die(json_encode(["error" => "Koneksi database gagal: " . $conn->connect_error]));
}
$conn->set_charset("utf8mb4");
+37
View File
@@ -0,0 +1,37 @@
<?php
include 'koneksi.php';
header('Content-Type: application/json');
$action = $_GET['action'] ?? 'list';
// ===== LIST LOG =====
if ($action === 'list') {
$limit = (int)($_GET['limit'] ?? 100);
$q = $conn->query("
SELECT l.*, u.nama_lengkap AS nama_user, u.username
FROM log_aktivitas l
LEFT JOIN user u ON l.user_id = u.id
ORDER BY l.created_at DESC
LIMIT $limit
");
$rows = [];
while ($r = $q->fetch_assoc()) $rows[] = $r;
echo json_encode($rows, JSON_UNESCAPED_UNICODE);
}
// ===== TAMBAH LOG =====
elseif ($action === 'tambah') {
$uid = (int)$_POST['user_id'];
$aksi = $_POST['aksi'] ?? '';
$tabel = $_POST['tabel'] ?? '';
$rid = (int)($_POST['record_id'] ?? 0);
$detail = $_POST['detail'] ?? '';
$ip = $_SERVER['REMOTE_ADDR'] ?? '';
$stmt = $conn->prepare("INSERT INTO log_aktivitas (user_id,aksi,tabel,record_id,detail,ip) VALUES (?,?,?,?,?,?)");
$stmt->bind_param("ississs", $uid, $aksi, $tabel, $rid, $detail, $ip);
$stmt->execute()
? print json_encode(['status'=>'success'])
: print json_encode(['status'=>'error','msg'=>$stmt->error]);
}
?>
+104
View File
@@ -0,0 +1,104 @@
<?php
include 'koneksi.php';
header('Content-Type: application/json');
// ===== AUTO-CREATE TABEL JIKA BELUM ADA =====
$conn->query("
CREATE TABLE IF NOT EXISTS riwayat_pendidikan (
id INT AUTO_INCREMENT PRIMARY KEY,
penduduk_id INT NOT NULL,
jenis ENUM('formal','pelatihan') DEFAULT 'formal',
institusi VARCHAR(150),
jenjang VARCHAR(100),
jurusan VARCHAR(100),
thn_masuk INT,
thn_lulus INT,
status ENUM('lulus','sedang_belajar','putus') DEFAULT 'lulus',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (penduduk_id) REFERENCES penduduk(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
");
$action = $_GET['action'] ?? $_POST['action'] ?? 'list';
// ===== LIST =====
if ($action === 'list') {
$result = $conn->query("
SELECT rp.*,
p.nama AS penduduk_nama,
p.nik
FROM riwayat_pendidikan rp
JOIN penduduk p ON rp.penduduk_id = p.id
ORDER BY rp.created_at DESC
");
$rows = [];
if ($result) {
while ($r = $result->fetch_assoc()) $rows[] = $r;
}
echo json_encode($rows, JSON_UNESCAPED_UNICODE);
}
// ===== SIMPAN =====
elseif ($action === 'simpan') {
$pid = (int)($_POST['penduduk_id'] ?? 0);
$jenis = $_POST['jenis'] ?? 'formal';
$inst = $_POST['institusi'] ?? '';
$jenjang = $_POST['jenjang'] ?? '';
$jurusan = $_POST['jurusan'] ?? '';
$thn_msk = !empty($_POST['thn_masuk']) ? (int)$_POST['thn_masuk'] : null;
$thn_lls = !empty($_POST['thn_lulus']) ? (int)$_POST['thn_lulus'] : null;
$status = $_POST['status'] ?? 'lulus';
if (!$pid) {
echo json_encode(["status" => "error", "msg" => "penduduk_id tidak valid"]);
exit;
}
$stmt = $conn->prepare("
INSERT INTO riwayat_pendidikan
(penduduk_id, jenis, institusi, jenjang, jurusan, thn_masuk, thn_lulus, status)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
");
$stmt->bind_param("issssiis",
$pid, $jenis, $inst, $jenjang, $jurusan, $thn_msk, $thn_lls, $status
);
if ($stmt->execute()) {
$new_id = $conn->insert_id;
// Log aktivitas
$uid = (int)($_POST['user_id'] ?? 0);
if ($uid) {
$aksi = 'tambah_pendidikan';
$tbl = 'riwayat_pendidikan';
$det = "Tambah $jenis: $jenjang (penduduk ID $pid)";
$ip = $_SERVER['REMOTE_ADDR'] ?? '';
$log = $conn->prepare("INSERT INTO log_aktivitas (user_id,aksi,tabel,record_id,detail,ip) VALUES (?,?,?,?,?,?)");
$log->bind_param("issiiss", $uid, $aksi, $tbl, $new_id, $det, $ip);
$log->execute();
}
echo json_encode(["status" => "success", "id" => $new_id]);
} else {
echo json_encode(["status" => "error", "msg" => $stmt->error]);
}
$stmt->close();
}
// ===== HAPUS =====
elseif ($action === 'hapus') {
$id = (int)($_POST['id'] ?? 0);
$stmt = $conn->prepare("DELETE FROM riwayat_pendidikan WHERE id=?");
$stmt->bind_param("i", $id);
if ($stmt->execute()) {
echo json_encode(["status" => "success"]);
} else {
echo json_encode(["status" => "error", "msg" => $stmt->error]);
}
$stmt->close();
}
else {
echo json_encode(["status" => "error", "msg" => "Action tidak dikenal"]);
}
+168
View File
@@ -0,0 +1,168 @@
<?php
include 'koneksi.php';
header('Content-Type: application/json');
$tipe = $_POST['tipe'] ?? '';
// ===== RUMAH IBADAH =====
if ($tipe === 'ibadah') {
$nama = trim($_POST['nama'] ?? '');
$jenis = $_POST['jenis'] ?? 'lainnya';
$kontak = $_POST['kontak'] ?? '';
$alamat = $_POST['alamat'] ?? '';
$lat = (float)($_POST['lat'] ?? 0);
$lng = (float)($_POST['lng'] ?? 0);
$radius = (float)($_POST['radius'] ?? 500);
if (!$nama) { echo json_encode(["status"=>"error","msg"=>"Nama tidak boleh kosong"]); exit; }
$stmt = $conn->prepare("INSERT INTO rumah_ibadah (nama,jenis,kontak,alamat,lat,lng,radius) VALUES (?,?,?,?,?,?,?)");
$stmt->bind_param("ssssddd", $nama,$jenis,$kontak,$alamat,$lat,$lng,$radius);
if ($stmt->execute()) {
echo json_encode(["status"=>"success","id"=>(int)$conn->insert_id]);
} else {
echo json_encode(["status"=>"error","msg"=>$stmt->error]);
}
$stmt->close();
}
// ===== PENDUDUK =====
elseif ($tipe === 'penduduk') {
$nik = trim($_POST['nik'] ?? '');
$nama = trim($_POST['nama'] ?? '');
$jk = $_POST['jenis_kelamin'] ?? 'L';
$tgl_lahir = !empty($_POST['tanggal_lahir']) ? $_POST['tanggal_lahir'] : null;
$status_kel = $_POST['status_keluarga'] ?? 'lainnya';
$status_kawin = $_POST['status_perkawinan'] ?? 'belum_kawin';
$alamat = $_POST['alamat'] ?? '';
$no_hp = $_POST['no_hp'] ?? '';
$pekerjaan = $_POST['pekerjaan'] ?? '';
$penghasilan = (float)($_POST['penghasilan'] ?? 0);
$status_ekonomi = $_POST['status_ekonomi'] ?? 'rentan';
$pend_terakhir = $_POST['pendidikan_terakhir'] ?? 'tidak_sekolah';
$status_pend = $_POST['status_pendidikan'] ?? 'tidak_sekolah';
$lat = (float)($_POST['lat'] ?? 0);
$lng = (float)($_POST['lng'] ?? 0);
if (!$nik || !$nama) {
echo json_encode(["status"=>"error","msg"=>"NIK dan Nama wajib diisi"]);
exit;
}
// Cari rumah ibadah terdekat otomatis
$rumah_ibadah_id = null;
if ($lat && $lng) {
$s = $conn->prepare("SELECT id FROM rumah_ibadah ORDER BY (6371*acos(cos(radians(?))*cos(radians(lat))*cos(radians(lng)-radians(?))+sin(radians(?))*sin(radians(lat)))) ASC LIMIT 1");
$s->bind_param("ddd", $lat, $lng, $lat);
$s->execute();
$row = $s->get_result()->fetch_assoc();
$rumah_ibadah_id = $row ? (int)$row['id'] : null;
$s->close();
}
// INSERT — semua 16 kolom, tipe dijaga ketat
// Gunakan query langsung dengan escape untuk menghindari masalah nullable
$nik_e = $conn->real_escape_string($nik);
$nama_e = $conn->real_escape_string($nama);
$jk_e = $conn->real_escape_string($jk);
$tgl_e = $tgl_lahir ? "'".$conn->real_escape_string($tgl_lahir)."'" : 'NULL';
$stkel_e = $conn->real_escape_string($status_kel);
$stkaw_e = $conn->real_escape_string($status_kawin);
$almt_e = $conn->real_escape_string($alamat);
$hp_e = $conn->real_escape_string($no_hp);
$pkrj_e = $conn->real_escape_string($pekerjaan);
$ekn_e = $conn->real_escape_string($status_ekonomi);
$pend_e = $conn->real_escape_string($pend_terakhir);
$spnd_e = $conn->real_escape_string($status_pend);
$rid_e = $rumah_ibadah_id ? (int)$rumah_ibadah_id : 'NULL';
$sql = "INSERT INTO penduduk
(nik,nama,jenis_kelamin,tanggal_lahir,status_keluarga,status_perkawinan,
alamat,no_hp,pekerjaan,penghasilan,status_ekonomi,
pendidikan_terakhir,status_pendidikan,lat,lng,rumah_ibadah_id)
VALUES
('{$nik_e}','{$nama_e}','{$jk_e}',{$tgl_e},'{$stkel_e}','{$stkaw_e}',
'{$almt_e}','{$hp_e}','{$pkrj_e}',{$penghasilan},'{$ekn_e}',
'{$pend_e}','{$spnd_e}',{$lat},{$lng},{$rid_e})";
$stmt = $conn; // dummy untuk cek execute
if ($conn->query($sql)) {
$new_id = (int)$conn->insert_id;
// Log
$uid = (int)($_POST['user_id'] ?? 0);
if ($uid) {
$l = $conn->prepare("INSERT INTO log_aktivitas (user_id,aksi,tabel,record_id,detail,ip) VALUES (?,?,?,?,?,?)");
$aksi='tambah_penduduk'; $tbl='penduduk'; $det="Tambah penduduk: $nama"; $ip=$_SERVER['REMOTE_ADDR']??'';
$l->bind_param("ississ",$uid,$aksi,$tbl,$new_id,$det,$ip);
$l->execute();
}
echo json_encode(["status"=>"success","id"=>$new_id]);
} else {
echo json_encode(["status"=>"error","msg"=>$conn->error]);
}
}
// ===== LAPORAN =====
elseif ($tipe === 'laporan') {
$nama_pelapor = trim($_POST['nama_pelapor'] ?? 'Anonim') ?: 'Anonim';
$deskripsi = trim($_POST['deskripsi'] ?? '');
$urgensi = $_POST['urgensi'] ?? 'sedang';
$lat = (float)($_POST['lat'] ?? 0);
$lng = (float)($_POST['lng'] ?? 0);
if (!$deskripsi) { echo json_encode(["status"=>"error","msg"=>"Deskripsi wajib diisi"]); exit; }
$stmt = $conn->prepare("INSERT INTO laporan (nama_pelapor,deskripsi,lat,lng,urgensi) VALUES (?,?,?,?,?)");
$stmt->bind_param("ssdds", $nama_pelapor,$deskripsi,$lat,$lng,$urgensi);
if ($stmt->execute()) {
echo json_encode(["status"=>"success","id"=>(int)$conn->insert_id]);
} else {
echo json_encode(["status"=>"error","msg"=>$stmt->error]);
}
$stmt->close();
}
// ===== BANTUAN =====
elseif ($tipe === 'bantuan') {
$pid = (int)($_POST['penduduk_id'] ?? 0);
$jid = (int)($_POST['jenis_bantuan_id'] ?? 0);
$src = $_POST['sumber_bantuan'] ?? '';
$tgl = $_POST['tanggal'] ?? date('Y-m-d');
$jml = (float)($_POST['jumlah'] ?? 0);
$cat = $_POST['catatan'] ?? '';
$stat = $_POST['status'] ?? 'direncanakan';
$stmt = $conn->prepare("INSERT INTO histori_bantuan (penduduk_id,jenis_bantuan_id,sumber_bantuan,tanggal,jumlah,catatan,status) VALUES (?,?,?,?,?,?,?)");
$stmt->bind_param("iissdss",$pid,$jid,$src,$tgl,$jml,$cat,$stat);
if ($stmt->execute()) {
echo json_encode(["status"=>"success","id"=>(int)$conn->insert_id]);
} else {
echo json_encode(["status"=>"error","msg"=>$stmt->error]);
}
$stmt->close();
}
// ===== KELUARGA =====
elseif ($tipe === 'keluarga') {
$no_kk = trim($_POST['no_kk'] ?? '');
$alamat = $_POST['alamat'] ?? '';
$lat = (float)($_POST['lat'] ?? 0);
$lng = (float)($_POST['lng'] ?? 0);
if (!$no_kk) { echo json_encode(["status"=>"error","msg"=>"No. KK wajib diisi"]); exit; }
$stmt = $conn->prepare("INSERT INTO keluarga (no_kk,alamat,lat,lng) VALUES (?,?,?,?)");
$stmt->bind_param("ssdd",$no_kk,$alamat,$lat,$lng);
if ($stmt->execute()) {
echo json_encode(["status"=>"success","id"=>(int)$conn->insert_id]);
} else {
echo json_encode(["status"=>"error","msg"=>$stmt->error]);
}
$stmt->close();
}
else {
http_response_code(400);
echo json_encode(["status"=>"error","msg"=>"Tipe tidak dikenal: $tipe"]);
}
+318
View File
@@ -0,0 +1,318 @@
-- ============================================================
-- WebGIS Pengentasan Kemiskinan
-- Database: webgis_uas
-- Versi: 2.0 (Full System)
-- ============================================================
CREATE DATABASE IF NOT EXISTS webgis_uas
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
USE webgis_uas;
-- ============================================================
-- 1. ROLE (hak akses)
-- ============================================================
CREATE TABLE role (
id INT AUTO_INCREMENT PRIMARY KEY,
nama VARCHAR(50) NOT NULL, -- masyarakat | pengurus | pimpinan | admin
deskripsi TEXT
) ENGINE=InnoDB;
-- ============================================================
-- 2. USER (login)
-- ============================================================
CREATE TABLE user (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(80) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL, -- bcrypt
nama_lengkap VARCHAR(120),
email VARCHAR(120),
role_id INT NOT NULL,
aktif TINYINT(1) DEFAULT 1,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (role_id) REFERENCES role(id)
) ENGINE=InnoDB;
-- ============================================================
-- 3. RUMAH IBADAH
-- ============================================================
CREATE TABLE rumah_ibadah (
id INT AUTO_INCREMENT PRIMARY KEY,
nama VARCHAR(150) NOT NULL,
jenis ENUM('masjid','gereja','pura','vihara','klenteng','lainnya') NOT NULL,
kontak VARCHAR(50),
alamat TEXT,
lat DOUBLE NOT NULL,
lng DOUBLE NOT NULL,
radius DOUBLE DEFAULT 500, -- meter, zona layanan
user_id INT, -- pengurus penanggung-jawab
FOREIGN KEY (user_id) REFERENCES user(id) ON DELETE SET NULL
) ENGINE=InnoDB;
-- ============================================================
-- 4. KELUARGA (Kartu Keluarga)
-- ============================================================
CREATE TABLE keluarga (
id INT AUTO_INCREMENT PRIMARY KEY,
no_kk VARCHAR(20) UNIQUE NOT NULL,
alamat TEXT,
lat DOUBLE,
lng DOUBLE,
rumah_ibadah_id INT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (rumah_ibadah_id) REFERENCES rumah_ibadah(id) ON DELETE SET NULL
) ENGINE=InnoDB;
-- ============================================================
-- 5. PENDUDUK
-- ============================================================
CREATE TABLE penduduk (
id INT AUTO_INCREMENT PRIMARY KEY,
nik VARCHAR(16) UNIQUE NOT NULL,
nama VARCHAR(150) NOT NULL,
jenis_kelamin ENUM('L','P') NOT NULL,
tanggal_lahir DATE,
-- umur dihitung via VIEW / fungsi, tidak disimpan statis
status_keluarga ENUM('kepala_keluarga','istri','anak','orang_tua','lainnya') DEFAULT 'lainnya',
status_perkawinan ENUM('belum_kawin','kawin','cerai_hidup','cerai_mati') DEFAULT 'belum_kawin',
status_hidup ENUM('hidup','meninggal') DEFAULT 'hidup',
alamat TEXT,
lat DOUBLE,
lng DOUBLE,
no_hp VARCHAR(20),
pekerjaan VARCHAR(100),
penghasilan DECIMAL(15,2) DEFAULT 0,
status_ekonomi ENUM('miskin','rentan','mampu') DEFAULT 'rentan',
-- pendidikan
pendidikan_terakhir ENUM('tidak_sekolah','sd','smp','sma','d1','d2','d3','s1','s2','s3') DEFAULT 'tidak_sekolah',
status_pendidikan ENUM('sekolah','tidak_sekolah','lulus','putus_sekolah') DEFAULT 'tidak_sekolah',
-- relasi
keluarga_id INT,
rumah_ibadah_id INT,
-- meta
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (keluarga_id) REFERENCES keluarga(id) ON DELETE SET NULL,
FOREIGN KEY (rumah_ibadah_id) REFERENCES rumah_ibadah(id) ON DELETE SET NULL
) ENGINE=InnoDB;
-- ============================================================
-- 6. RIWAYAT PELATIHAN
-- ============================================================
CREATE TABLE pelatihan (
id INT AUTO_INCREMENT PRIMARY KEY,
penduduk_id INT NOT NULL,
nama_pelatihan VARCHAR(150),
penyelenggara VARCHAR(100),
tanggal DATE,
sertifikat TINYINT(1) DEFAULT 0,
FOREIGN KEY (penduduk_id) REFERENCES penduduk(id) ON DELETE CASCADE
) ENGINE=InnoDB;
-- ============================================================
-- 7. JENIS BANTUAN (master)
-- ============================================================
CREATE TABLE jenis_bantuan (
id INT AUTO_INCREMENT PRIMARY KEY,
nama VARCHAR(100) NOT NULL, -- sembako, pendidikan, kesehatan, …
kategori ENUM('sembako','pendidikan','kesehatan','ekonomi','lainnya') DEFAULT 'lainnya',
satuan VARCHAR(50), -- karung, paket, rupiah, …
deskripsi TEXT
) ENGINE=InnoDB;
-- ============================================================
-- 8. HISTORI BANTUAN
-- ============================================================
CREATE TABLE histori_bantuan (
id INT AUTO_INCREMENT PRIMARY KEY,
penduduk_id INT NOT NULL,
jenis_bantuan_id INT NOT NULL,
sumber_bantuan VARCHAR(100), -- rumah ibadah / pemerintah / donatur
tanggal DATE NOT NULL,
jumlah DECIMAL(10,2),
status ENUM('direncanakan','disalurkan','selesai') DEFAULT 'direncanakan',
catatan TEXT,
user_id INT, -- yg menginput
FOREIGN KEY (penduduk_id) REFERENCES penduduk(id) ON DELETE CASCADE,
FOREIGN KEY (jenis_bantuan_id) REFERENCES jenis_bantuan(id),
FOREIGN KEY (user_id) REFERENCES user(id) ON DELETE SET NULL
) ENGINE=InnoDB;
-- ============================================================
-- 9. LAPORAN MASYARAKAT
-- ============================================================
CREATE TABLE laporan (
id INT AUTO_INCREMENT PRIMARY KEY,
nama_pelapor VARCHAR(100),
penduduk_id INT, -- opsional, terkait siapa
deskripsi TEXT NOT NULL,
lat DOUBLE,
lng DOUBLE,
foto VARCHAR(255),
urgensi ENUM('rendah','sedang','tinggi','darurat') DEFAULT 'sedang',
status ENUM('pending','diverifikasi','diproses','selesai') DEFAULT 'pending',
ditangani_oleh INT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (penduduk_id) REFERENCES penduduk(id) ON DELETE SET NULL,
FOREIGN KEY (ditangani_oleh) REFERENCES user(id) ON DELETE SET NULL
) ENGINE=InnoDB;
-- ============================================================
-- 10. CHAT / KOMUNIKASI ANTAR PENGURUS
-- ============================================================
CREATE TABLE chat (
id INT AUTO_INCREMENT PRIMARY KEY,
from_user INT NOT NULL,
to_user INT, -- NULL = broadcast ke semua pengurus
pesan TEXT NOT NULL,
dibaca TINYINT(1) DEFAULT 0,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (from_user) REFERENCES user(id) ON DELETE CASCADE,
FOREIGN KEY (to_user) REFERENCES user(id) ON DELETE SET NULL
) ENGINE=InnoDB;
-- ============================================================
-- 11. LOG AKTIVITAS
-- ============================================================
CREATE TABLE log_aktivitas (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT,
aksi VARCHAR(100), -- create_penduduk, update_bantuan, …
tabel VARCHAR(50),
record_id INT,
detail TEXT,
ip VARCHAR(45),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES user(id) ON DELETE SET NULL
) ENGINE=InnoDB;
-- ============================================================
-- VIEW: umur otomatis
-- ============================================================
CREATE OR REPLACE VIEW v_penduduk AS
SELECT
p.*,
TIMESTAMPDIFF(YEAR, p.tanggal_lahir, CURDATE()) AS umur,
k.no_kk,
r.nama AS nama_ibadah,
r.jenis AS jenis_ibadah
FROM penduduk p
LEFT JOIN keluarga k ON p.keluarga_id = k.id
LEFT JOIN rumah_ibadah r ON p.rumah_ibadah_id = r.id;
-- ============================================================
-- DATA AWAL: ROLE
-- ============================================================
INSERT INTO role (nama, deskripsi) VALUES
('admin', 'Administrator sistem penuh'),
('pengurus', 'Pengurus Rumah Ibadah input & verifikasi'),
('pimpinan', 'Pimpinan Daerah read-only & dashboard'),
('masyarakat','Warga biasa lapor & lihat data terbatas');
-- ============================================================
-- DATA AWAL: USER (password semua = "password123" → bcrypt)
-- ============================================================
INSERT INTO user (username, password, nama_lengkap, email, role_id) VALUES
('admin', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 'Administrator', 'admin@webgis.id', 1),
('pengurus1', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 'Ahmad Fauzi', 'ahmad@masjid.id', 2),
('pengurus2', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 'Budi Santoso', 'budi@gereja.id', 2),
('pimpinan1', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 'Camat Pontianak Kota', 'camat@pontianak.id', 3),
('warga1', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 'Dewi Lestari', 'dewi@gmail.com', 4);
-- ============================================================
-- DATA AWAL: RUMAH IBADAH (Pontianak area)
-- ============================================================
INSERT INTO rumah_ibadah (nama, jenis, kontak, alamat, lat, lng, radius, user_id) VALUES
('Masjid Raya Mujahidin', 'masjid', '0561-7001234', 'Jl. Ahmad Yani, Pontianak', -0.0231, 109.3294, 600, 2),
('Masjid Al-Falah', 'masjid', '0561-7005678', 'Jl. Gajah Mada, Pontianak', -0.0312, 109.3215, 500, 2),
('Gereja Katolik Katedral', 'gereja', '0561-7009012', 'Jl. Rahadi Usman, Pontianak', -0.0280, 109.3320, 550, 3),
('Vihara Bodhicitta Maitreya','vihara', '0561-7003456', 'Jl. Diponegoro, Pontianak', -0.0265, 109.3341, 400, NULL),
('Gereja GPIB Imanuel', 'gereja', '0561-7007890', 'Jl. Tanjungpura, Pontianak', -0.0245, 109.3270, 500, 3);
-- ============================================================
-- DATA AWAL: KELUARGA
-- ============================================================
INSERT INTO keluarga (no_kk, alamat, lat, lng, rumah_ibadah_id) VALUES
('6171010101230001', 'Jl. Veteran No.12, RT01 RW01', -0.0250, 109.3280, 1),
('6171010101230002', 'Jl. Tanjungpura No.45, RT02 RW01',-0.0270, 109.3310, 3),
('6171010101230003', 'Jl. Gajah Mada No.7, RT01 RW02', -0.0235, 109.3225, 2),
('6171010101230004', 'Jl. Diponegoro No.33, RT03 RW02',-0.0280, 109.3355, 4),
('6171010101230005', 'Jl. Ahmad Yani No.88, RT02 RW03',-0.0195, 109.3290, 1);
-- ============================================================
-- DATA AWAL: PENDUDUK (dummy realistis)
-- ============================================================
INSERT INTO penduduk
(nik, nama, jenis_kelamin, tanggal_lahir, status_keluarga, status_perkawinan,
status_hidup, alamat, lat, lng, no_hp, pekerjaan, penghasilan,
status_ekonomi, pendidikan_terakhir, status_pendidikan, keluarga_id, rumah_ibadah_id)
VALUES
('6171010101800001','Hasan Basri', 'L','1980-05-15','kepala_keluarga','kawin', 'hidup','Jl. Veteran No.12', -0.02510,109.32810,'081234560001','buruh_harian', 800000, 'miskin', 'sd', 'tidak_sekolah',1,1),
('6171010101820002','Siti Rahmawati', 'P','1982-08-22','istri', 'kawin', 'hidup','Jl. Veteran No.12', -0.02510,109.32810,'081234560002','ibu_rumah_tangga',0, 'miskin', 'sd', 'tidak_sekolah',1,1),
('6171010101070003','Rizky Pratama', 'L','2007-03-10','anak', 'belum_kawin', 'hidup','Jl. Veteran No.12', -0.02520,109.32820,'', 'pelajar', 0, 'miskin', 'smp', 'sekolah', 1,1),
('6171010101750004','Widodo Santoso', 'L','1975-11-30','kepala_keluarga','kawin', 'hidup','Jl. Tanjungpura No.45',-0.02700,109.33100,'081234560004','pedagang', 1500000,'rentan', 'sma', 'lulus', 2,3),
('6171010101780005','Maria Goretti', 'P','1978-06-18','istri', 'kawin', 'hidup','Jl. Tanjungpura No.45',-0.02700,109.33100,'081234560005','penjahit', 700000, 'rentan', 'smp', 'lulus', 2,3),
('6171010101090006','Anastasia Dewi', 'P','2009-01-25','anak', 'belum_kawin', 'hidup','Jl. Tanjungpura No.45',-0.02710,109.33110,'', 'pelajar', 0, 'rentan', 'sd', 'sekolah', 2,3),
('6171010101650007','Darman Husin', 'L','1965-04-04','kepala_keluarga','kawin', 'hidup','Jl. Gajah Mada No.7', -0.02355,109.32260,'081234560007','nelayan', 600000, 'miskin', 'sd', 'tidak_sekolah',3,2),
('6171010101680008','Aminah Binti Umar','P','1968-09-12','istri', 'kawin', 'hidup','Jl. Gajah Mada No.7', -0.02355,109.32260,'081234560008','ibu_rumah_tangga',0, 'miskin', 'tidak_sekolah','tidak_sekolah',3,2),
('6171010101200009','Fadhil Rahmat', 'L','2020-07-07','anak', 'belum_kawin', 'hidup','Jl. Gajah Mada No.7', -0.02360,109.32270,'', '', 0, 'miskin', 'tidak_sekolah','tidak_sekolah',3,2),
('6171010101550010','Candra Wijaya', 'L','1955-12-01','kepala_keluarga','cerai_mati', 'hidup','Jl. Diponegoro No.33',-0.02800,109.33550,'081234560010','pensiunan', 2500000,'mampu', 's1', 'lulus', 4,4),
('6171010101850011','Rudi Hartono', 'L','1985-02-14','kepala_keluarga','kawin', 'hidup','Jl. Ahmad Yani No.88',-0.01960,109.32910,'081234560011','wiraswasta', 3000000,'mampu', 's1', 'lulus', 5,1),
('6171010101880012','Lina Kusuma', 'P','1988-07-30','istri', 'kawin', 'hidup','Jl. Ahmad Yani No.88',-0.01960,109.32910,'081234560012','guru', 2800000,'mampu', 's1', 'lulus', 5,1),
('6171010101700013','Suparman', 'L','1970-03-20','kepala_keluarga','kawin', 'hidup','Jl. Veteran No.22', -0.02430,109.32750,'081234560013','tukang_bangunan',900000,'miskin', 'smp', 'lulus', 1,1),
('6171010101120014','Nurul Hidayah', 'P','2012-11-11','anak', 'belum_kawin', 'hidup','Jl. Veteran No.22', -0.02440,109.32760,'', 'pelajar', 0, 'miskin', 'sd', 'sekolah', 1,1),
('6171010101920015','Bagas Setiawan', 'L','1992-05-05','kepala_keluarga','kawin', 'hidup','Jl. KH Wahid Hasyim', -0.02900,109.32500,'081234560015','ojek_online', 1200000,'rentan', 'sma', 'lulus', NULL,2);
-- ============================================================
-- DATA AWAL: JENIS BANTUAN
-- ============================================================
INSERT INTO jenis_bantuan (nama, kategori, satuan, deskripsi) VALUES
('Sembako Bulanan', 'sembako', 'paket', 'Paket beras 10kg + minyak + gula'),
('Bantuan Pendidikan', 'pendidikan', 'rupiah', 'Biaya SPP / seragam / buku'),
('Bantuan Kesehatan', 'kesehatan', 'paket', 'Obat-obatan dan biaya berobat'),
('Modal Usaha Kecil', 'ekonomi', 'rupiah', 'Pinjaman tanpa bunga untuk usaha'),
('Pakaian Layak Pakai', 'lainnya', 'koli', 'Pakaian bekas layak pakai');
-- ============================================================
-- DATA AWAL: HISTORI BANTUAN
-- ============================================================
INSERT INTO histori_bantuan (penduduk_id, jenis_bantuan_id, sumber_bantuan, tanggal, jumlah, status, catatan, user_id) VALUES
(1, 1, 'Masjid Raya Mujahidin', '2025-01-15', 1, 'selesai', 'Periode Januari 2025', 2),
(1, 1, 'Masjid Raya Mujahidin', '2025-02-15', 1, 'selesai', 'Periode Februari 2025',2),
(1, 3, 'Puskesmas Kota', '2025-03-10', 1, 'selesai', 'Berobat influenza', 2),
(2, 1, 'Masjid Raya Mujahidin', '2025-01-15', 1, 'selesai', 'Periode Januari 2025', 2),
(3, 2, 'Dinas Pendidikan', '2025-01-20', 500000,'selesai', 'Bantuan seragam SD', 2),
(7, 1, 'Masjid Al-Falah', '2025-02-01', 1, 'selesai', 'Paket sembako', 2),
(7, 3, 'Puskesmas Kota', '2025-04-05', 1, 'disalurkan', 'Pengobatan rutin', 2),
(8, 1, 'Masjid Al-Falah', '2025-02-01', 1, 'selesai', 'Paket sembako', 2),
(13,1, 'Masjid Raya Mujahidin', '2025-03-15', 1, 'selesai', 'Paket sembako Maret', 2),
(15,4, 'Gereja GPIB Imanuel', '2025-05-01', 2000000,'direncanakan','Modal usaha warung',3);
-- ============================================================
-- DATA AWAL: LAPORAN MASYARAKAT
-- ============================================================
INSERT INTO laporan (nama_pelapor, penduduk_id, deskripsi, lat, lng, urgensi, status) VALUES
('Anonim', 7, 'Pak Darman sudah 3 hari tidak bisa makan, sakit dan tidak ada yang merawat.', -0.02355,109.32260,'darurat', 'diverifikasi'),
('Ibu RT 02', 1, 'Keluarga Hasan Basri membutuhkan bantuan sembako, penghasilan turun drastis.', -0.02510,109.32810,'tinggi', 'diproses'),
('Warga Setempat',NULL,'Ada anak kecil di Jl. Gajah Mada yg tidak sekolah dan terlihat kurang gizi.', -0.02360,109.32280,'tinggi', 'pending'),
('Bagas S.', NULL,'Kebutuhan modal usaha kecil di kawasan Jl. KH Wahid Hasyim.', -0.02900,109.32500,'sedang', 'pending'),
('Anonim', NULL,'Lansia sebatang kara di Jl. Diponegoro membutuhkan perhatian.', -0.02810,109.33560,'sedang', 'pending');
-- ============================================================
-- DATA AWAL: CHAT
-- ============================================================
INSERT INTO chat (from_user, to_user, pesan) VALUES
(2, 3, 'Pak Budi, apakah gereja bisa bantu keluarga Widodo di Jl. Tanjungpura? Kondisi cukup memprihatinkan.'),
(3, 2, 'Insya Allah siap. Minggu depan kami ada jadwal distribusi. Boleh koordinasi lebih lanjut.'),
(2, NULL, '[BROADCAST] Pengumpulan sembako bulan ini dimulai 10 Juni. Mohon kontribusi semua pihak.');
-- ============================================================
-- DATA AWAL: LOG AKTIVITAS
-- ============================================================
INSERT INTO log_aktivitas (user_id, aksi, tabel, record_id, detail) VALUES
(2,'create','penduduk',1,'Menambah data penduduk Hasan Basri'),
(2,'create','histori_bantuan',1,'Menyalurkan sembako ke penduduk ID 1'),
(3,'update','laporan',1,'Memverifikasi laporan darurat Darman Husin');
+9
View File
@@ -0,0 +1,9 @@
FROM php:8.2-apache
RUN docker-php-ext-install mysqli pdo pdo_mysql \
&& a2enmod rewrite
COPY . /var/www/html/
RUN mkdir -p /var/www/html/05/uploads/bukti \
&& chown -R www-data:www-data /var/www/html
+1060
View File
File diff suppressed because it is too large Load Diff