yllumi / wmpanel
Webman plugin yllumi/wmpanel
Requires
- composer-plugin-api: ^2.0
- firebase/php-jwt: ^7.0
- guzzlehttp/guzzle: ^7.10
- phpmailer/phpmailer: ^7.0
- robmorgan/phinx: ^0.16.10
- symfony/yaml: ^7.0
- vlucas/phpdotenv: ^5.6
- webman/cache: ^2.1
- webman/console: ^2.1
- webman/database: ^2.1
- webman/redis: ^2.1
- workerman/redis: ^2.0
- yllumi/heroic-webman: ^0.1
Requires (Dev)
- composer/composer: ^2.0
README
Panel administrasi siap pakai untuk framework Webman. Menyediakan autentikasi, manajemen pengguna, role & privilege berbasis YAML, dynamic entry CRUD, manajemen menu, pengaturan aplikasi, Redis browser, dan email sender—semua terintegrasi dalam satu package.
Package ini tidak dilanjutkan. Silakan lihat package baru untuk fitur serupa ini di https://github.com/yllumi/sayagi
Daftar Isi
- Fitur
- Persyaratan
- Instalasi
- Konfigurasi Awal
- Fitur & Penggunaan
- Perintah CLI (Console Commands)
- Struktur Database
- Lisensi
Fitur
| Fitur | Deskripsi |
|---|---|
| Autentikasi | Login, logout, lupa password, reset password, registrasi (opsional) |
| Manajemen User | CRUD user dengan filter status & pencarian |
| Manajemen Role | CRUD role untuk pengelompokan hak akses |
| Manajemen Privilege | Definisi & pengelolaan privilege berbasis file YAML |
| Manajemen Menu | Konfigurasi sidebar menu panel secara dinamis via UI |
| Settings | Pengaturan aplikasi, tema, emailer, dan plugin via YAML + UI |
| Dynamic Entry CRUD | CRUD generik berbasis schema YAML per plugin |
| Redis Browser | Melihat, membuat, mengedit, dan menghapus key Redis |
| Email Sender | Pengiriman email via PHPMailer dengan template OTP bawaan |
| FormBuilder | Pembuat form dinamis dari array/YAML dengan berbagai tipe field |
| AuthMiddleware | Proteksi otomatis route /panel/* + pengecekan privilege via PHP Attribute |
Persyaratan
- PHP >= 8.1
- Webman Framework
- MySQL / MariaDB
- Redis (opsional, untuk fitur Redis Browser & cache)
- Composer
Instalasi
1. Install via Composer
composer require yllumi/wmpanel
2. Jalankan Perintah Install
Perintah berikut akan menjalankan migrasi database, seeder awal, dan mempublikasikan file konfigurasi ke project:
php webman wmpanel:install
Proses ini akan:
- Membuat tabel-tabel yang dibutuhkan (
mein_users,mein_roles,mein_privileges,mein_settings, dll.) - Menyalin file konfigurasi ke
config/plugin/panel/ - Menyalin file menu & privilege ke
config/plugin/panel/
3. Buat User Admin Pertama
php webman wmpanel:user:create
Ikuti prompt interaktif untuk mengisi nama, username, email, dan password. Anda juga bisa memberikan argumen langsung:
php webman wmpanel:user:create "Admin" "admin" "admin@example.com" "password123" --role=1
4. Akses Panel
Buka browser dan navigasi ke:
http://localhost:8787/panel
Konfigurasi Awal
File konfigurasi utama setelah instalasi berada di config/plugin/panel/:
config/plugin/panel/
├── menu.yml # Konfigurasi menu sidebar
├── privileges.yml # Definisi privilege sistem
Konfigurasi aplikasi dasar ada di config/plugin/panel/app.php:
return [ 'enable' => true, 'debug' => true, 'site_title' => 'HeroicAdmin', 'enable_registration' => false, // Aktifkan melalui env: app.enable_registration=true ];
Untuk mengaktifkan registrasi pengguna, tambahkan pada file .env:
app.enable_registration=true
Fitur & Penggunaan
Autentikasi
Panel secara otomatis memproteksi semua route /panel/* melalui AuthMiddleware. Pengguna yang belum login akan diarahkan ke halaman login.
Route Autentikasi:
| Method | URL | Fungsi |
|---|---|---|
| GET | /panel/auth/login |
Halaman login |
| POST | /panel/auth/login |
Proses login |
| GET | /panel/auth/logout |
Logout |
| GET | /panel/auth/forgot |
Halaman lupa password |
| POST | /panel/auth/forgot |
Kirim link reset password |
| GET | /panel/auth/reset |
Halaman reset password |
| POST | /panel/auth/reset |
Proses reset password |
| POST | /panel/auth/register |
Proses registrasi (jika diaktifkan) |
Alur Login:
- User memasukkan username/email dan password.
- Password diverifikasi menggunakan Phpass (bcrypt-compatible).
- Data user disimpan ke session setelah berhasil login.
Manajemen User
Kelola pengguna sistem melalui antarmuka CRUD lengkap dengan filter dan pencarian.
Route:
| Method | URL | Fungsi |
|---|---|---|
| GET | /panel/user |
Daftar user |
| GET | /panel/user/data |
Data JSON (pagination + search) |
| GET | /panel/user/create |
Form tambah user |
| POST | /panel/user/store |
Simpan user baru |
| GET | /panel/user/edit |
Form edit user |
| POST | /panel/user/update |
Update user |
| POST | /panel/user/delete |
Hapus user |
Fitur:
- Filter berdasarkan status (active, inactive, all)
- Pencarian berdasarkan nama, username, email, atau nomor telepon
- Assign role kepada user
- Proteksi aksi dengan privilege (
user.read,user.write,user.delete)
Manajemen Role
Kelola role/grup pengguna yang dapat ditetapkan pada setiap user.
Route:
| Method | URL | Fungsi |
|---|---|---|
| GET | /panel/role |
Daftar role |
| GET | /panel/role/data |
Data JSON |
| GET | /panel/role/create |
Form tambah role |
| POST | /panel/role/store |
Simpan role baru |
| GET | /panel/role/edit |
Form edit role |
| POST | /panel/role/update |
Update role |
| POST | /panel/role/delete |
Hapus role |
Fitur:
- Setiap role dapat memiliki kumpulan privilege
- Diproteksi dengan privilege
role.read,role.write,role.delete,role.set_privilege
Manajemen Privilege
Privilege didefinisikan dalam file YAML dan dapat dikelola melalui UI panel.
File: config/plugin/panel/privileges.yml
dashboard: - { read: 'Read dashboard data' } - { set_widget: 'Customize dashboard widgets' } user: - { read: 'Read user data' } - { write: 'Write modification of user data' } - { delete: 'Delete user records' } - { set_role: 'Assign roles to users' } role: - { read: 'Read role data' } - { write: 'Write modification of role data' } - { delete: 'Delete role records' } - { set_privilege: 'Assign privileges to roles' }
Format privilege menggunakan notasi feature.action (contoh: user.read, role.write).
Route:
| Method | URL | Fungsi |
|---|---|---|
| GET | /panel/privilege |
Daftar privilege |
| GET | /panel/privilege/data |
Data JSON |
| GET | /panel/privilege/features |
Daftar fitur |
| GET | /panel/privilege/create |
Form tambah privilege |
| POST | /panel/privilege/store |
Simpan privilege |
| GET | /panel/privilege/edit |
Form edit privilege |
| POST | /panel/privilege/update |
Update privilege |
| POST | /panel/privilege/delete |
Hapus privilege |
Pengecekan privilege di kode:
// Cek apakah user boleh melakukan aksi if (isAllow('user.write')) { // user memiliki izin }
Manajemen Menu Panel
Konfigurasi sidebar menu panel secara dinamis melalui UI tanpa perlu edit file secara manual.
File: config/plugin/panel/menu.yml
- id: menu_69d223a8a20be8 label: Dashboard module: dashboard icon: 'bi bi-grid-fill' url: /panel privilege: dashboard.read children: {} - id: menu_abc123 label: Pengguna module: user icon: 'bi bi-lock-fill' url: '#' privilege: user.read children: - id: menu_abc124 label: Users url: /panel/user privilege: user.read - id: menu_abc125 label: Roles url: /panel/role privilege: role.read
Route:
| Method | URL | Fungsi |
|---|---|---|
| GET | /panel/panelmenu |
Kelola menu |
| POST | /panel/panelmenu/store |
Tambah menu baru |
| GET | /panel/panelmenu/edit |
Edit menu |
| POST | /panel/panelmenu/update |
Update menu |
| POST | /panel/panelmenu/delete |
Hapus menu |
| POST | /panel/panelmenu/reorder |
Ubah urutan menu |
Mendapatkan daftar menu di view:
$menus = sidebarMenus(); // global helper function
Pengaturan Aplikasi (Settings)
Pengaturan dikonfigurasi via file YAML dan dikelola melalui antarmuka UI panel. Setiap group setting didefinisikan dalam file .yml terpisah di src/settings/.
Group Setting Bawaan:
| Slug | File | Deskripsi |
|---|---|---|
theme |
theme.yml |
Tema frontend & admin, warna, background |
emailer |
emailer.yml |
Konfigurasi SMTP untuk pengiriman email |
app |
app.yml |
Logo, warna tema, navbar, bottom menu |
plugin |
plugin.yml |
Modul aktif dan entry yang dinonaktifkan |
Contoh theme.yml:
name: Theme slug: theme menu_position: 20 setting: main_theme: field: main_theme label: Frontend Theme form: select default: mobilekit options: mobilekit: mobilekit magazine: magazine admin_bgcolor: field: admin_bgcolor label: Admin Background Color form: color default: "#52BCD3"
Tipe form yang didukung: text, number, email, color, image, select, switcher, code, mask
Route:
| Method | URL | Fungsi |
|---|---|---|
| GET | /panel/setting |
Halaman pengaturan |
| GET | /panel/setting/data |
Data JSON pengaturan |
| POST | /panel/setting/save |
Simpan pengaturan |
Dynamic Entry CRUD
Fitur paling fleksibel dari wmpanel—memungkinkan pembuatan CRUD lengkap hanya dengan mendefinisikan schema dalam file YAML tanpa menulis controller baru.
Cara Membuat Entry Baru:
- Buat file schema di
plugin/{nama_plugin}/app/entry/{slug}.yml:
name: Mahasiswa table: mahasiswas fields: - field: name label: Nama Lengkap type: text searchable: true table_display: true - field: nim label: NIM type: text searchable: true table_display: true - field: jurusan_id label: Jurusan type: select table_display: true relation: table: jurusans value: id display: nama_jurusan - field: tanggal_lahir label: Tanggal Lahir type: date - field: foto label: Foto type: image
- Akses CRUD melalui URL:
GET /panel/entry/mahasiswa → Daftar
GET /panel/entry/mahasiswa/data → Data JSON
GET /panel/entry/mahasiswa/create → Form tambah
POST /panel/entry/mahasiswa/store → Simpan
GET /panel/entry/mahasiswa/edit → Form edit
POST /panel/entry/mahasiswa/update → Update
POST /panel/entry/mahasiswa/delete → Hapus
Tipe Field yang Didukung:
text,number,email,textareaselect(dengan relasi tabel)date,image,colorcheckbox,radio,switchermask,code
Fitur Relasi Otomatis:
Ketika field memiliki relation, sistem akan otomatis melakukan LEFT JOIN saat menampilkan data:
- field: role_id label: Role type: select relation: table: mein_roles value: id display: role_name
Redis Browser
Antarmuka web untuk mengelola Redis key langsung dari panel admin.
Route:
| Method | URL | Fungsi |
|---|---|---|
| GET | /panel/redis |
Halaman Redis browser |
| GET | /panel/redis/keys?pattern=* |
Daftar key dengan filter pattern |
| GET | /panel/redis/get?key=xxx |
Ambil nilai & TTL key |
| POST | /panel/redis/set |
Buat/update key |
| POST | /panel/redis/delete |
Hapus key |
| POST | /panel/redis/rename |
Rename key |
| POST | /panel/redis/flush |
Flush semua key |
Tipe data Redis yang didukung: string, list, set, zset, hash
Contoh penggunaan API (JSON body untuk set key):
{
"key": "app:config",
"type": "string",
"value": "hello world",
"ttl": 3600
}
Email Sender
Library untuk mengirim email menggunakan PHPMailer dengan konfigurasi SMTP dari panel settings.
Penggunaan Dasar:
use Yllumi\Wmpanel\libraries\EmailSender; $sender = new EmailSender(); // Kirim ke satu penerima $sender->sendEmail('user@example.com', 'Subject', '<p>Isi email HTML</p>'); // Kirim ke beberapa penerima $sender->sendEmail( ['user1@example.com' => 'User Satu', 'user2@example.com' => 'User Dua'], 'Subject', '<p>Isi email HTML</p>' );
Template OTP Bawaan:
use Yllumi\Wmpanel\libraries\EmailSender; $html = EmailSender::otpTemplate('Nama User', '123456', 'Nama Aplikasi'); $sender = new EmailSender(); $sender->sendEmail('user@example.com', 'Kode OTP Anda', $html);
Konfigurasi SMTP diambil dari environment variable atau settings panel:
mail.smtp_host=smtp.gmail.com mail.smtp_port=465 mail.smtp_username=user@gmail.com mail.smtp_password=app_password mail.from_address=no-reply@example.com mail.from_name=Nama Aplikasi
FormBuilder
Library untuk membuat form HTML dinamis dari array atau schema YAML.
Penggunaan Basic:
use Yllumi\Wmpanel\libraries\FormBuilder\FormBuilder; $form = new FormBuilder(); $html = $form->schemaArray([ ['name' => 'nama', 'type' => 'text', 'label' => 'Nama Lengkap'], ['name' => 'email', 'type' => 'email', 'label' => 'Email'], ['name' => 'role', 'type' => 'select', 'label' => 'Role', 'options' => [ 1 => 'Admin', 2 => 'User', ]], ])->render($currentValues);
Tipe Field yang Tersedia:
| Type | Deskripsi |
|---|---|
text |
Input teks biasa |
number |
Input angka |
email |
Input email |
textarea |
Input teks panjang |
select |
Dropdown pilihan |
radio |
Pilihan radio button |
checkbox |
Checkbox |
switcher |
Toggle switch |
date |
Date picker |
color |
Color picker |
image |
Upload gambar |
mask |
Input dengan mask (misal: password, telepon) |
code |
Code editor (mendukung mode CSS, YAML, dll.) |
Attribute RequirePrivilege
PHP 8 Attribute untuk deklaratif meng-guard method controller berdasarkan privilege. AuthMiddleware akan secara otomatis membaca attribute ini.
Penggunaan:
use Yllumi\Wmpanel\attributes\RequirePrivilege; class ProductController extends AdminController { // Guard dengan satu privilege #[RequirePrivilege('product.read')] public function index(Request $request) { ... } // Guard dengan beberapa privilege (semua harus terpenuhi) #[RequirePrivilege('product.write')] #[RequirePrivilege('inventory.manage')] public function store(Request $request) { ... } // Dengan whitelist user_id yang selalu diloloskan #[RequirePrivilege('report.export', whitelistIds: [1, 2])] public function export(Request $request) { ... } }
Jika user tidak memiliki privilege yang dibutuhkan, akan dikembalikan halaman 404.
Perintah CLI (Console Commands)
| Perintah | Deskripsi |
|---|---|
php webman wmpanel:install |
Instalasi plugin: jalankan migrasi & publish file konfigurasi |
php webman wmpanel:user:create |
Buat user baru secara interaktif |
php webman wmpanel:update |
Update plugin ke versi terbaru |
php webman make:migration NamaMigrasi |
Buat file migrasi baru menggunakan Phinx |
php webman migrate |
Jalankan semua migrasi yang belum dijalankan |
php webman migrate:rollback |
Rollback migrasi terakhir |
php webman db:seed |
Jalankan database seeder |
Contoh membuat user via argumen:
php webman wmpanel:user:create "Budi Santoso" "budi" "budi@example.com" "secret123" \ --role=1 \ --phone="081234567890" \ --status=active
Contoh membuat migrasi:
php webman make:migration CreateProductsTable
# File migrasi akan dibuat di database/migrations/
Struktur Database
Tabel utama yang dibuat oleh wmpanel:
| Tabel | Deskripsi |
|---|---|
mein_users |
Data pengguna (id, name, username, email, password, phone, status, role_id) |
mein_roles |
Data role (id, role_name, description) |
mein_privileges |
Mapping privilege per role (role_id, feature, privilege) |
mein_settings |
Key-value store untuk konfigurasi aplikasi (group, field, value) |
Lisensi
MIT License. Lihat file LICENSE untuk detail.