diff --git a/docker/init-databases.sql b/docker/init-databases.sql index 416da1b..8f96437 100644 --- a/docker/init-databases.sql +++ b/docker/init-databases.sql @@ -1,9 +1,242 @@ --- Inisialisasi database untuk deploy Docker / Coolify +-- Buat database CREATE DATABASE IF NOT EXISTS webgis_p3 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE DATABASE IF NOT EXISTS webgis_spbu CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE DATABASE IF NOT EXISTS WEB_GIS CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +-- Kasih akses user webgis GRANT ALL PRIVILEGES ON webgis_p3.* TO 'webgis'@'%'; GRANT ALL PRIVILEGES ON webgis_spbu.* TO 'webgis'@'%'; GRANT ALL PRIVILEGES ON WEB_GIS.* TO 'webgis'@'%'; FLUSH PRIVILEGES; + +-- Import data webgis_p3 +USE webgis_p3; +-- ============================================================ +-- DATABASE LENGKAP: webgis_p3 +-- WebGIS Poverty Mapping + Sistem Login (3 Role) +-- Import file ini ke Laragon phpMyAdmin +-- ============================================================ + +CREATE DATABASE IF NOT EXISTS webgis_p3 + CHARACTER SET utf8mb4 + COLLATE utf8mb4_unicode_ci; + +USE webgis_p3; + +-- ── Tabel Data Jalan (Polyline) ──────────────────────────── +CREATE TABLE IF NOT EXISTS data_jalan ( + id INT AUTO_INCREMENT PRIMARY KEY, + nama_jalan VARCHAR(200) NOT NULL, + status ENUM('Nasional','Provinsi','Kabupaten') NOT NULL DEFAULT 'Kabupaten', + panjang_m DOUBLE NOT NULL DEFAULT 0, + geojson LONGTEXT NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- ── Tabel Data Parsil Tanah (Polygon) ───────────────────── +CREATE TABLE IF NOT EXISTS data_parsil ( + id INT AUTO_INCREMENT PRIMARY KEY, + no_parsil VARCHAR(100) NOT NULL, + pemilik VARCHAR(200) NOT NULL, + status ENUM('SHM','HGB','HGU','HP') NOT NULL DEFAULT 'SHM', + luas_m2 DOUBLE NOT NULL DEFAULT 0, + geojson LONGTEXT NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- ── Tabel Data SPBU (Point/Marker) ──────────────────────── +CREATE TABLE IF NOT EXISTS data_spbu ( + id INT AUTO_INCREMENT PRIMARY KEY, + nama_spbu VARCHAR(200) NOT NULL, + no_wa VARCHAR(20) NOT NULL, + buka_24_jam ENUM('Ya','Tidak') NOT NULL DEFAULT 'Tidak', + latitude DOUBLE NOT NULL, + longitude DOUBLE NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- ── Data Contoh SPBU ────────────────────────────────────── +INSERT INTO data_spbu (nama_spbu, no_wa, buka_24_jam, latitude, longitude) VALUES +('SPBU Jl. Ahmad Yani', '0812-1111-0001', 'Ya', -0.0400, 109.3200), +('SPBU Jl. Gajah Mada', '0812-1111-0002', 'Ya', -0.0520, 109.3450), +('SPBU Jl. Diponegoro', '0812-1111-0003', 'Tidak', -0.0610, 109.3600), +('SPBU Jl. Sutan Syahrir', '0812-1111-0004', 'Tidak', -0.0480, 109.3700), +('SPBU Jl. Kom. Yos Sudarso', '0812-1111-0005', 'Ya', -0.0350, 109.3550); + +-- ── Tabel Data Kemiskinan (Point/Marker) ────────────────── +CREATE TABLE IF NOT EXISTS data_kemiskinan ( + id INT AUTO_INCREMENT PRIMARY KEY, + nama_kk VARCHAR(200) NOT NULL, + jumlah_kk INT NOT NULL DEFAULT 1, + alamat TEXT NOT NULL, + latitude DOUBLE NOT NULL, + longitude DOUBLE NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- ── Tabel Data Rumah Ibadah (Point/Marker + Radius Buffer) +CREATE TABLE IF NOT EXISTS data_masjid ( + id INT AUTO_INCREMENT PRIMARY KEY, + nama_masjid VARCHAR(200) NOT NULL, + jenis ENUM('Masjid','Mushola','Gereja','Pura','Vihara','Klenteng') NOT NULL DEFAULT 'Masjid', + pic_masjid VARCHAR(200) NOT NULL, + alamat TEXT NOT NULL, + radius_m INT NOT NULL DEFAULT 500, + latitude DOUBLE NOT NULL, + longitude DOUBLE NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- ── Tabel Users (Sistem Login 3 Role) ───────────────────── +CREATE TABLE IF NOT EXISTS users ( + id INT AUTO_INCREMENT PRIMARY KEY, + username VARCHAR(100) NOT NULL UNIQUE, + nama_lengkap VARCHAR(200) NOT NULL, + role ENUM('admin','petugas','pengurus','walikota') NOT NULL, + password_hash VARCHAR(255) NOT NULL, + aktif TINYINT(1) NOT NULL DEFAULT 1, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + INDEX idx_role (role), + INDEX idx_aktif (aktif) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- ── Akun Demo ───────────────────────────────────────────── +-- Password semua akun: "password" (bcrypt via PHP PASSWORD_DEFAULT) +INSERT INTO users (username, nama_lengkap, role, password_hash) VALUES +( + 'admin', + 'Administrator Sistem', + 'admin', + '$2y$10$mhMxyKlOSSTQxfmWXEncfe1AF56CJ8fb.v0h0CYZ.ELQQd8iP5LrG' +), +( + 'pengurus', + 'Pengurus Rumah Ibadah', + 'pengurus', + '$2y$10$mhMxyKlOSSTQxfmWXEncfe1AF56CJ8fb.v0h0CYZ.ELQQd8iP5LrG' +), +( + 'walikota', + 'Walikota Pontianak', + 'walikota', + '$2y$10$mhMxyKlOSSTQxfmWXEncfe1AF56CJ8fb.v0h0CYZ.ELQQd8iP5LrG' +); + + +-- Import data webgis_spbu +USE webgis_spbu; +-- ============================================================ +-- DATABASE: webgis_spbu +-- Pertemuan 3 – Layer Groups and Layers Control +-- Data SPBU dengan 2 Layer Group: Buka 24 Jam & Tidak 24 Jam +-- ============================================================ + +CREATE DATABASE IF NOT EXISTS webgis_spbu + CHARACTER SET utf8mb4 + COLLATE utf8mb4_unicode_ci; + +USE webgis_spbu; + +-- buka_24_jam: 'Ya' → Layer Group "SPBU Buka 24 Jam" +-- 'Tidak' → Layer Group "SPBU Tidak Buka 24 Jam" +CREATE TABLE IF NOT EXISTS data_spbu ( + id INT AUTO_INCREMENT PRIMARY KEY, + nama_spbu VARCHAR(200) NOT NULL, + alamat VARCHAR(300) NOT NULL, + no_wa VARCHAR(20) NOT NULL, + buka_24_jam ENUM('Ya','Tidak') NOT NULL DEFAULT 'Tidak', + latitude DOUBLE NOT NULL, + longitude DOUBLE NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Migrasi: tambah kolom alamat jika tabel lama dari PovertyMap belum punya +-- ALTER TABLE data_spbu ADD COLUMN alamat VARCHAR(300) NOT NULL DEFAULT '' AFTER nama_spbu; +-- UPDATE data_spbu SET alamat = CONCAT(nama_spbu, ', Pontianak') WHERE alamat = ''; + +INSERT IGNORE INTO data_spbu (nama_spbu, alamat, no_wa, buka_24_jam, latitude, longitude) VALUES +('SPBU Jl. Ahmad Yani', 'Jl. Ahmad Yani No. 12, Pontianak', '0812-1111-0001', 'Ya', -0.0400, 109.3200), +('SPBU Jl. Gajah Mada', 'Jl. Gajah Mada No. 45, Pontianak', '0812-1111-0002', 'Ya', -0.0520, 109.3450), +('SPBU Jl. Diponegoro', 'Jl. Diponegoro No. 88, Pontianak', '0812-1111-0003', 'Tidak', -0.0610, 109.3600), +('SPBU Jl. Sutan Syahrir', 'Jl. Sutan Syahrir No. 5, Pontianak', '0812-1111-0004', 'Tidak', -0.0480, 109.3700), +('SPBU Jl. Kom. Yos Sudarso', 'Jl. Kom. Yos Sudarso No. 22, Pontianak', '0812-1111-0005', 'Ya', -0.0350, 109.3550), +('SPBU Jl. Tanjung Raya', 'Jl. Tanjung Raya No. 101, Pontianak', '0812-1111-0006', 'Tidak', -0.0580, 109.3300), +('SPBU Jl. Veteran', 'Jl. Veteran No. 33, Pontianak', '0812-1111-0007', 'Ya', -0.0450, 109.3380); +) + +-- Import data WEB_GIS +USE WEB_GIS; +-- ========================================================= +-- WebGIS - Struktur Database +-- Tugas: Manajemen Data Jalan & Parsil Tanah (Kavling) +-- Database: WEB_GIS +-- Tipe Geometri: GeoJSON (LineString & Polygon) +-- ========================================================= + +CREATE DATABASE IF NOT EXISTS WEB_GIS + CHARACTER SET utf8mb4 + COLLATE utf8mb4_unicode_ci; + +USE WEB_GIS; + +-- --------------------------------------------------------- +-- TABEL 1: Manajemen Data Jalan +-- Tipe Geometri : GeoJSON LineString +-- Panjang Jalan : Dihitung otomatis oleh LeafletJS (meter) +-- --------------------------------------------------------- +CREATE TABLE IF NOT EXISTS `tb_jalan` ( + `id` INT NOT NULL AUTO_INCREMENT COMMENT 'Primary key jalan', + `nama_jalan` VARCHAR(100) NOT NULL COMMENT 'Nama ruas jalan', + `status_jalan` ENUM( + 'Nasional', + 'Provinsi', + 'Kabupaten' + ) NOT NULL COMMENT 'Status administrasi jalan', + `panjang_jalan` DECIMAL(12,2) NOT NULL DEFAULT '0.00' COMMENT 'Panjang jalan dalam meter (dihitung otomatis LeafletJS via L.LatLng.distanceTo)', + `geojson` JSON NOT NULL COMMENT 'Koordinat geometri dalam format GeoJSON LineString', + `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB + DEFAULT CHARSET=utf8mb4 + COLLATE=utf8mb4_unicode_ci + COMMENT='Tabel manajemen data jalan berdasarkan status administrasi. Geometri disimpan sebagai GeoJSON LineString.'; + + +-- --------------------------------------------------------- +-- TABEL 2: Manajemen Parsil Tanah / Kavling +-- Tipe Geometri : GeoJSON Polygon +-- Luas Tanah : Dihitung otomatis oleh LeafletJS (m²) +-- --------------------------------------------------------- +CREATE TABLE IF NOT EXISTS `tb_parsil` ( + `id` INT NOT NULL AUTO_INCREMENT COMMENT 'Primary key parsil', + `nama_parsil` VARCHAR(100) NOT NULL COMMENT 'Nama atau nomor identifikasi parsil tanah', + `status_kepemilikan` ENUM( + 'SHM', + 'HGB', + 'HGU', + 'HP' + ) NOT NULL COMMENT 'Status sertifikat kepemilikan: SHM=Sertifikat Hak Milik, HGB=Hak Guna Bangunan, HGU=Hak Guna Usaha, HP=Hak Pakai', + `luas_tanah` DECIMAL(16,4) NOT NULL DEFAULT '0.0000' COMMENT 'Luas tanah dalam meter persegi (dihitung otomatis LeafletJS via formula geodesic spherical)', + `geojson` JSON NOT NULL COMMENT 'Koordinat geometri dalam format GeoJSON Polygon', + `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB + DEFAULT CHARSET=utf8mb4 + COLLATE=utf8mb4_unicode_ci + COMMENT='Tabel manajemen parsil/kavling tanah berdasarkan status kepemilikan. Geometri disimpan sebagai GeoJSON Polygon.'; + + +-- --------------------------------------------------------- +-- Contoh Indeks untuk performa query filter +-- --------------------------------------------------------- +ALTER TABLE `tb_jalan` ADD INDEX `idx_status_jalan` (`status_jalan`); +ALTER TABLE `tb_parsil` ADD INDEX `idx_status_parsil` (`status_kepemilikan`);