add file
This commit is contained in:
@@ -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);
|
||||
?>
|
||||
@@ -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
@@ -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;
|
||||
}
|
||||
?>
|
||||
@@ -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;
|
||||
}
|
||||
?>
|
||||
@@ -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: '© <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
@@ -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>
|
||||
@@ -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");
|
||||
?>
|
||||
@@ -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;
|
||||
}
|
||||
?>
|
||||
@@ -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
|
||||
}
|
||||
?>
|
||||
@@ -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 */;
|
||||
@@ -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;
|
||||
}
|
||||
?>
|
||||
@@ -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
@@ -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";
|
||||
?>
|
||||
@@ -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
@@ -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>
|
||||
@@ -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");
|
||||
?>
|
||||
@@ -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
@@ -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 */;
|
||||
File diff suppressed because one or more lines are too long
+166
@@ -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
@@ -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>
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -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);
|
||||
?>
|
||||
@@ -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
@@ -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;
|
||||
}
|
||||
?>
|
||||
@@ -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;
|
||||
}
|
||||
?>
|
||||
@@ -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;
|
||||
}
|
||||
?>
|
||||
@@ -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: '© <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
@@ -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: '© 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>
|
||||
@@ -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");
|
||||
?>
|
||||
@@ -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;
|
||||
}
|
||||
?>
|
||||
@@ -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
|
||||
}
|
||||
?>
|
||||
@@ -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 */;
|
||||
@@ -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;
|
||||
}
|
||||
?>
|
||||
@@ -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
@@ -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);
|
||||
}
|
||||
?>
|
||||
@@ -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);
|
||||
@@ -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
@@ -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"]);
|
||||
}
|
||||
@@ -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
File diff suppressed because it is too large
Load Diff
@@ -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
@@ -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]);
|
||||
}
|
||||
?>
|
||||
@@ -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
@@ -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"]);
|
||||
}
|
||||
@@ -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');
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user