From 534d2d926deb5a2ac9207f76b097425932887569 Mon Sep 17 00:00:00 2001 From: Januar Date: Sat, 13 Jun 2026 11:51:34 +0700 Subject: [PATCH] Initial commit - SIG Bansos --- .dockerignore | 3 + login.html | 80 +++++ nginx.conf | 21 ++ nixpacks.toml.toml | 14 + sig-bansos/DASHBOARD ADMIN.html | 142 ++++++++ sig-bansos/ORANG BERKEBUTUHAN.html | 274 +++++++++++++++ sig-bansos/PENGGUNA UMUM.html | 236 +++++++++++++ sig-bansos/RUMAH IBADAT.html | 329 ++++++++++++++++++ sig-jalan/api.php | 300 ++++++++++++++++ sig-jalan/api_ibadah.php | 106 ++++++ sig-jalan/api_login.php | 55 +++ sig-jalan/api_orang.php | 93 +++++ .../rusak/rusak_1780971487_6a2777df24ae2.png | Bin 0 -> 6229 bytes 13 files changed, 1653 insertions(+) create mode 100644 .dockerignore create mode 100644 login.html create mode 100644 nginx.conf create mode 100644 nixpacks.toml.toml create mode 100644 sig-bansos/DASHBOARD ADMIN.html create mode 100644 sig-bansos/ORANG BERKEBUTUHAN.html create mode 100644 sig-bansos/PENGGUNA UMUM.html create mode 100644 sig-bansos/RUMAH IBADAT.html create mode 100644 sig-jalan/api.php create mode 100644 sig-jalan/api_ibadah.php create mode 100644 sig-jalan/api_login.php create mode 100644 sig-jalan/api_orang.php create mode 100644 sig-jalan/uploads/rusak/rusak_1780971487_6a2777df24ae2.png diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..ea7761d --- /dev/null +++ b/.dockerignore @@ -0,0 +1,3 @@ +.git +.gitignore +README.md \ No newline at end of file diff --git a/login.html b/login.html new file mode 100644 index 0000000..65705f0 --- /dev/null +++ b/login.html @@ -0,0 +1,80 @@ + + + + + + SIG Bansos - Login + + + + + +
+
+
+ +
+
+
+ + + + \ No newline at end of file diff --git a/nginx.conf b/nginx.conf new file mode 100644 index 0000000..d990d80 --- /dev/null +++ b/nginx.conf @@ -0,0 +1,21 @@ +server { + listen 80; + server_name _; + root /app; + index index.html; + + location / { + try_files $uri $uri/ =404; + } + + location /sig-jalan/ { + try_files $uri $uri/ =404; + } + + location ~ \.php$ { + fastcgi_pass unix:/var/run/php/php8.2-fpm.sock; + fastcgi_index index.php; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + include fastcgi_params; + } +} \ No newline at end of file diff --git a/nixpacks.toml.toml b/nixpacks.toml.toml new file mode 100644 index 0000000..f57f583 --- /dev/null +++ b/nixpacks.toml.toml @@ -0,0 +1,14 @@ +[providers] +type = "php" + +[phases.setup] +nixPkgs = ["php", "php82Extensions.mysqli", "php82Extensions.pdo", "php82Extensions.pdo_mysql"] + +[phases.build] +cmds = [] + +[phases.install] +cmds = [] + +[start] +cmd = "php-fpm -D && nginx -g 'daemon off;'" \ No newline at end of file diff --git a/sig-bansos/DASHBOARD ADMIN.html b/sig-bansos/DASHBOARD ADMIN.html new file mode 100644 index 0000000..1ad98b5 --- /dev/null +++ b/sig-bansos/DASHBOARD ADMIN.html @@ -0,0 +1,142 @@ + + + + + + SIG Bansos - Dashboard Admin + + + + + + + + + + + + +
+
+
+
+

0

+

Orang Berkebutuhan

+
+
+
+
+

0

+

Tempat Ibadah

+
+
+ + +
+ +
+
+
+ Legenda: + Orang + Masjid + Gereja + Klenteng + Vihara + Pura +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/sig-bansos/ORANG BERKEBUTUHAN.html b/sig-bansos/ORANG BERKEBUTUHAN.html new file mode 100644 index 0000000..f87d4ed --- /dev/null +++ b/sig-bansos/ORANG BERKEBUTUHAN.html @@ -0,0 +1,274 @@ + + + + + + SIG Bansos - Orang Berkebutuhan + + + + + + + + + + +
+
+

SIG Bansos - Orang Berkebutuhan

+ +
+
+
+
+
+ + +
+
+
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/sig-bansos/PENGGUNA UMUM.html b/sig-bansos/PENGGUNA UMUM.html new file mode 100644 index 0000000..488ff8a --- /dev/null +++ b/sig-bansos/PENGGUNA UMUM.html @@ -0,0 +1,236 @@ + + + + + + SIG Bansos - Pengguna Umum + + + + + + + + +
+
+

SIG Bantuan Sosial - Peta Persebaran

+ Pengguna Umum +
+ + +
+
+
+

0

+

Orang Berkebutuhan

+
+
+
+
+

0

+

Tempat Ibadah

+
+
+
+
+ Legenda: +
+
+
Orang Berkebutuhan
+
Masjid
+
Gereja
+
+
+
Klenteng
+
Vihara
+
Pura
+
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+ + + + \ No newline at end of file diff --git a/sig-bansos/RUMAH IBADAT.html b/sig-bansos/RUMAH IBADAT.html new file mode 100644 index 0000000..280d45a --- /dev/null +++ b/sig-bansos/RUMAH IBADAT.html @@ -0,0 +1,329 @@ + + + + + + SIG Bansos - Tempat Ibadah + + + + + + + + + + +
+
+

SIG Bansos - Tempat Ibadah

+ +
+
+
+
+
+ + + + + + +
+
+
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/sig-jalan/api.php b/sig-jalan/api.php new file mode 100644 index 0000000..5cd90da --- /dev/null +++ b/sig-jalan/api.php @@ -0,0 +1,300 @@ +setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); +} catch(PDOException $e) { + echo json_encode(['success' => false, 'message' => 'Database connection failed: ' . $e->getMessage()]); + exit(); +} + +// Get request parameters +$type = isset($_GET['type']) ? $_GET['type'] : ''; +$action = isset($_GET['action']) ? $_GET['action'] : ''; +$id = isset($_GET['id']) ? intval($_GET['id']) : null; +$method = $_SERVER['REQUEST_METHOD']; + +// Map type to table name +$tables = [ + 'spbu' => 'spbu', + 'jalan' => 'jalan', + 'parsil' => 'parsil', + 'rusak' => 'jalan_rusak' +]; + +if (!isset($tables[$type])) { + echo json_encode(['success' => false, 'message' => 'Invalid type']); + exit(); +} + +$table = $tables[$type]; + +// Handle different actions +switch ($action) { + case 'getAll': + getAll($pdo, $table); + break; + case 'getOne': + getOne($pdo, $table, $id); + break; + case 'create': + if ($method === 'POST') { + create($pdo, $table, $type); + } + break; + case 'update': + if ($method === 'PUT') { + update($pdo, $table, $type, $id); + } + break; + case 'delete': + if ($method === 'DELETE') { + delete($pdo, $table, $id); + } + break; + case 'add': // Alias for create (SPBU) + if ($method === 'POST') { + create($pdo, $table, $type); + } + break; + default: + echo json_encode(['success' => false, 'message' => 'Invalid action']); +} + +// ==================== FUNCTIONS ==================== + +function getAll($pdo, $table) { + try { + if ($table === 'jalan' || $table === 'parsil') { + $stmt = $pdo->query("SELECT * FROM $table ORDER BY id DESC"); + $data = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // Decode JSON coordinates + foreach ($data as &$row) { + if (isset($row['coordinates'])) { + $row['coordinates'] = json_decode($row['coordinates'], true); + } + } + } else { + $stmt = $pdo->query("SELECT * FROM $table ORDER BY id DESC"); + $data = $stmt->fetchAll(PDO::FETCH_ASSOC); + } + + echo json_encode(['success' => true, 'data' => $data]); + } catch(PDOException $e) { + echo json_encode(['success' => false, 'message' => $e->getMessage()]); + } +} + +function getOne($pdo, $table, $id) { + try { + $stmt = $pdo->prepare("SELECT * FROM $table WHERE id = ?"); + $stmt->execute([$id]); + $data = $stmt->fetch(PDO::FETCH_ASSOC); + + if ($data) { + if (isset($data['coordinates'])) { + $data['coordinates'] = json_decode($data['coordinates'], true); + } + echo json_encode(['success' => true, 'data' => $data]); + } else { + echo json_encode(['success' => false, 'message' => 'Data not found']); + } + } catch(PDOException $e) { + echo json_encode(['success' => false, 'message' => $e->getMessage()]); + } +} + +function create($pdo, $table, $type) { + $input = json_decode(file_get_contents('php://input'), true); + + if (!$input) { + // Check if it's form-data (for file upload) + if ($type === 'rusak' && isset($_POST['nama'])) { + createRusak($pdo); + return; + } + echo json_encode(['success' => false, 'message' => 'No input data']); + return; + } + + try { + switch ($type) { + case 'spbu': + $stmt = $pdo->prepare("INSERT INTO spbu (nama, no_spbu, tipe, latitude, longitude) VALUES (?, ?, ?, ?, ?)"); + $stmt->execute([ + $input['nama'], + $input['no_spbu'], + $input['tipe'], + $input['latitude'], + $input['longitude'] + ]); + break; + + case 'jalan': + $coordinates = json_encode($input['coordinates']); + $stmt = $pdo->prepare("INSERT INTO jalan (nama, status, panjang, coordinates) VALUES (?, ?, ?, ?)"); + $stmt->execute([ + $input['nama'], + $input['status'], + $input['panjang'], + $coordinates + ]); + break; + + case 'parsil': + $coordinates = json_encode($input['coordinates']); + $stmt = $pdo->prepare("INSERT INTO parsil (nama, status, luas, coordinates) VALUES (?, ?, ?, ?)"); + $stmt->execute([ + $input['nama'], + $input['status'], + $input['luas'], + $coordinates + ]); + break; + } + + $newId = $pdo->lastInsertId(); + echo json_encode(['success' => true, 'message' => 'Data created successfully', 'id' => $newId]); + } catch(PDOException $e) { + echo json_encode(['success' => false, 'message' => $e->getMessage()]); + } +} + +function createRusak($pdo) { + try { + $nama = $_POST['nama']; + $latitude = $_POST['latitude']; + $longitude = $_POST['longitude']; + $fotoPath = ''; + + // Handle file upload + if (isset($_FILES['foto']) && $_FILES['foto']['error'] === UPLOAD_ERR_OK) { + $uploadDir = 'uploads/rusak/'; + if (!is_dir($uploadDir)) { + mkdir($uploadDir, 0777, true); + } + + $fileExtension = pathinfo($_FILES['foto']['name'], PATHINFO_EXTENSION); + $fileName = 'rusak_' . time() . '_' . uniqid() . '.' . $fileExtension; + $uploadPath = $uploadDir . $fileName; + + if (move_uploaded_file($_FILES['foto']['tmp_name'], $uploadPath)) { + $fotoPath = $uploadPath; + } + } + + $stmt = $pdo->prepare("INSERT INTO jalan_rusak (nama, latitude, longitude, foto) VALUES (?, ?, ?, ?)"); + $stmt->execute([$nama, $latitude, $longitude, $fotoPath]); + + $newId = $pdo->lastInsertId(); + echo json_encode(['success' => true, 'message' => 'Data created successfully', 'id' => $newId]); + } catch(PDOException $e) { + echo json_encode(['success' => false, 'message' => $e->getMessage()]); + } +} + +function update($pdo, $table, $type, $id) { + $input = json_decode(file_get_contents('php://input'), true); + + if (!$input) { + echo json_encode(['success' => false, 'message' => 'No input data']); + return; + } + + try { + switch ($type) { + case 'spbu': + $stmt = $pdo->prepare("UPDATE spbu SET nama=?, no_spbu=?, tipe=?, latitude=?, longitude=? WHERE id=?"); + $stmt->execute([ + $input['nama'], + $input['no_spbu'], + $input['tipe'], + $input['latitude'], + $input['longitude'], + $id + ]); + break; + + case 'jalan': + $coordinates = json_encode($input['coordinates']); + $stmt = $pdo->prepare("UPDATE jalan SET nama=?, status=?, panjang=?, coordinates=? WHERE id=?"); + $stmt->execute([ + $input['nama'], + $input['status'], + $input['panjang'], + $coordinates, + $id + ]); + break; + + case 'parsil': + $coordinates = json_encode($input['coordinates']); + $stmt = $pdo->prepare("UPDATE parsil SET nama=?, status=?, luas=?, coordinates=? WHERE id=?"); + $stmt->execute([ + $input['nama'], + $input['status'], + $input['luas'], + $coordinates, + $id + ]); + break; + + case 'rusak': + $stmt = $pdo->prepare("UPDATE jalan_rusak SET nama=?, latitude=?, longitude=? WHERE id=?"); + $stmt->execute([ + $input['nama'], + $input['latitude'], + $input['longitude'], + $id + ]); + break; + } + + echo json_encode(['success' => true, 'message' => 'Data updated successfully']); + } catch(PDOException $e) { + echo json_encode(['success' => false, 'message' => $e->getMessage()]); + } +} + +function delete($pdo, $table, $id) { + try { + // Delete associated file for rusak + if ($table === 'jalan_rusak') { + $stmt = $pdo->prepare("SELECT foto FROM jalan_rusak WHERE id = ?"); + $stmt->execute([$id]); + $data = $stmt->fetch(PDO::FETCH_ASSOC); + if ($data && $data['foto'] && file_exists($data['foto'])) { + unlink($data['foto']); + } + } + + $stmt = $pdo->prepare("DELETE FROM $table WHERE id = ?"); + $stmt->execute([$id]); + + if ($stmt->rowCount() > 0) { + echo json_encode(['success' => true, 'message' => 'Data deleted successfully']); + } else { + echo json_encode(['success' => false, 'message' => 'Data not found']); + } + } catch(PDOException $e) { + echo json_encode(['success' => false, 'message' => $e->getMessage()]); + } +} +?> \ No newline at end of file diff --git a/sig-jalan/api_ibadah.php b/sig-jalan/api_ibadah.php new file mode 100644 index 0000000..55e2629 --- /dev/null +++ b/sig-jalan/api_ibadah.php @@ -0,0 +1,106 @@ +setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); +} catch(PDOException $e) { + echo json_encode(['success' => false, 'message' => 'Database connection failed']); + exit(); +} + +$type = isset($_GET['type']) ? $_GET['type'] : ''; +$action = isset($_GET['action']) ? $_GET['action'] : ''; +$id = isset($_GET['id']) ? intval($_GET['id']) : null; +$method = $_SERVER['REQUEST_METHOD']; + +$validTypes = ['masjid', 'gereja', 'klenteng', 'vihara', 'pura']; + +if (!in_array($type, $validTypes)) { + echo json_encode(['success' => false, 'message' => 'Invalid type']); + exit(); +} + +$table = 'tempat_ibadah'; + +switch ($action) { + case 'getAll': + $stmt = $pdo->prepare("SELECT * FROM $table WHERE jenis = ? ORDER BY nama ASC"); + $stmt->execute([$type]); + $data = $stmt->fetchAll(PDO::FETCH_ASSOC); + echo json_encode(['success' => true, 'data' => $data]); + break; + + case 'getOne': + $stmt = $pdo->prepare("SELECT * FROM $table WHERE id = ? AND jenis = ?"); + $stmt->execute([$id, $type]); + $data = $stmt->fetch(PDO::FETCH_ASSOC); + if ($data) { + echo json_encode(['success' => true, 'data' => $data]); + } else { + echo json_encode(['success' => false, 'message' => 'Data tidak ditemukan']); + } + break; + + case 'create': + if ($method === 'POST') { + $input = json_decode(file_get_contents('php://input'), true); + $stmt = $pdo->prepare("INSERT INTO $table (jenis, nama, alamat, no_hp, latitude, longitude, radius, keterangan) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"); + $stmt->execute([ + $type, + $input['nama'], + $input['alamat'] ?? '', + $input['no_hp'] ?? '', + $input['latitude'], + $input['longitude'], + $input['radius'] ?? 500, + $input['keterangan'] ?? '' + ]); + echo json_encode(['success' => true, 'message' => 'Data berhasil disimpan', 'id' => $pdo->lastInsertId()]); + } + break; + + case 'update': + if ($method === 'PUT') { + $input = json_decode(file_get_contents('php://input'), true); + $stmt = $pdo->prepare("UPDATE $table SET nama=?, alamat=?, no_hp=?, latitude=?, longitude=?, radius=?, keterangan=? WHERE id=? AND jenis=?"); + $stmt->execute([ + $input['nama'], + $input['alamat'] ?? '', + $input['no_hp'] ?? '', + $input['latitude'], + $input['longitude'], + $input['radius'] ?? 500, + $input['keterangan'] ?? '', + $id, + $type + ]); + echo json_encode(['success' => true, 'message' => 'Data berhasil diupdate']); + } + break; + + case 'delete': + if ($method === 'DELETE') { + $stmt = $pdo->prepare("DELETE FROM $table WHERE id = ?"); + $stmt->execute([$id]); + echo json_encode(['success' => true, 'message' => 'Data berhasil dihapus']); + } + break; + + default: + echo json_encode(['success' => false, 'message' => 'Invalid action']); +} +?> \ No newline at end of file diff --git a/sig-jalan/api_login.php b/sig-jalan/api_login.php new file mode 100644 index 0000000..89b1549 --- /dev/null +++ b/sig-jalan/api_login.php @@ -0,0 +1,55 @@ +setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); +} catch(PDOException $e) { + echo json_encode(['success' => false, 'message' => 'Database connection failed']); + exit(); +} + +$action = isset($_GET['action']) ? $_GET['action'] : ''; + +if ($action === 'login' && $_SERVER['REQUEST_METHOD'] === 'POST') { + $input = json_decode(file_get_contents('php://input'), true); + + if (!$input || !isset($input['username']) || !isset($input['password'])) { + echo json_encode(['success' => false, 'message' => 'Username dan password harus diisi']); + exit(); + } + + $stmt = $pdo->prepare("SELECT * FROM users WHERE username = ? AND password = MD5(?)"); + $stmt->execute([$input['username'], $input['password']]); + $user = $stmt->fetch(PDO::FETCH_ASSOC); + + if ($user) { + echo json_encode([ + 'success' => true, + 'message' => 'Login berhasil', + 'data' => [ + 'id' => $user['id'], + 'username' => $user['username'], + 'role' => $user['role'] + ] + ]); + } else { + echo json_encode(['success' => false, 'message' => 'Username atau password salah']); + } +} else { + echo json_encode(['success' => false, 'message' => 'Invalid action']); +} +?> \ No newline at end of file diff --git a/sig-jalan/api_orang.php b/sig-jalan/api_orang.php new file mode 100644 index 0000000..beed974 --- /dev/null +++ b/sig-jalan/api_orang.php @@ -0,0 +1,93 @@ +setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); +} catch(PDOException $e) { + echo json_encode(['success' => false, 'message' => 'Database connection failed']); + exit(); +} + +$action = isset($_GET['action']) ? $_GET['action'] : ''; +$id = isset($_GET['id']) ? intval($_GET['id']) : null; +$method = $_SERVER['REQUEST_METHOD']; + +switch ($action) { + case 'getAll': + $stmt = $pdo->query("SELECT * FROM orang_berkebutuhan ORDER BY id DESC"); + $data = $stmt->fetchAll(PDO::FETCH_ASSOC); + echo json_encode(['success' => true, 'data' => $data]); + break; + + case 'getOne': + $stmt = $pdo->prepare("SELECT * FROM orang_berkebutuhan WHERE id = ?"); + $stmt->execute([$id]); + $data = $stmt->fetch(PDO::FETCH_ASSOC); + if ($data) { + echo json_encode(['success' => true, 'data' => $data]); + } else { + echo json_encode(['success' => false, 'message' => 'Data tidak ditemukan']); + } + break; + + case 'create': + if ($method === 'POST') { + $input = json_decode(file_get_contents('php://input'), true); + $stmt = $pdo->prepare("INSERT INTO orang_berkebutuhan (nama, alamat, jenis_kebutuhan, no_hp, latitude, longitude, keterangan) VALUES (?, ?, ?, ?, ?, ?, ?)"); + $stmt->execute([ + $input['nama'], + $input['alamat'] ?? '', + $input['jenis_kebutuhan'] ?? '', + $input['no_hp'] ?? '', + $input['latitude'], + $input['longitude'], + $input['keterangan'] ?? '' + ]); + echo json_encode(['success' => true, 'message' => 'Data berhasil disimpan', 'id' => $pdo->lastInsertId()]); + } + break; + + case 'update': + if ($method === 'PUT') { + $input = json_decode(file_get_contents('php://input'), true); + $stmt = $pdo->prepare("UPDATE orang_berkebutuhan SET nama=?, alamat=?, jenis_kebutuhan=?, no_hp=?, latitude=?, longitude=?, keterangan=? WHERE id=?"); + $stmt->execute([ + $input['nama'], + $input['alamat'] ?? '', + $input['jenis_kebutuhan'] ?? '', + $input['no_hp'] ?? '', + $input['latitude'], + $input['longitude'], + $input['keterangan'] ?? '', + $id + ]); + echo json_encode(['success' => true, 'message' => 'Data berhasil diupdate']); + } + break; + + case 'delete': + if ($method === 'DELETE') { + $stmt = $pdo->prepare("DELETE FROM orang_berkebutuhan WHERE id = ?"); + $stmt->execute([$id]); + echo json_encode(['success' => true, 'message' => 'Data berhasil dihapus']); + } + break; + + default: + echo json_encode(['success' => false, 'message' => 'Invalid action']); +} +?> \ No newline at end of file diff --git a/sig-jalan/uploads/rusak/rusak_1780971487_6a2777df24ae2.png b/sig-jalan/uploads/rusak/rusak_1780971487_6a2777df24ae2.png new file mode 100644 index 0000000000000000000000000000000000000000..8d650935581b611a7332b02c0119995ba6eab361 GIT binary patch literal 6229 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 literal 0 HcmV?d00001