Apa itu PrizeX
PrizeX ialah platform hadiah, permainan dan pasaran berasaskan PHP: lelongan, loteri, kotak misteri, kelompok permainan arked, kedai e-dagang berbilang penjual dan ekonomi dompet/syiling — semuanya dalam satu aplikasi self-hosted. Ia dihantar dengan seni bina plugin/tema, panel admin dan 38 plugin get laluan pembayaran yang merangkumi kad, dompet, kripto dan pemproses serantau, serta 3 kaedah pembayaran manual yang disemai oleh kernel.
Tiada kunci masuk SaaS: anda memasangnya pada hosting anda sendiri, memiliki pangkalan data, dan mendapat kemas kini seumur hidup dengan lesen itu. Setiap vertikal (lelongan, loteri, kotak misteri, permainan, kedai) boleh dihidupkan atau dimatikan secara berasingan dari panel admin — pemasangan baharu boleh berjalan sebagai produk satu vertikal atau suit penuh.
Kod teras tidak pernah bergantung mati pada sesebuah plugin. Setiap vertikal, get laluan pembayaran dan log masuk sosial ialah plugin di bawah plugins/ yang boleh diaktifkan, dinyahaktifkan atau dipadamkan tanpa merosakkan bahagian lain laman ini.
Awalan jadual tbl_, tiada ORM, kebanyakannya prepared statement. Setiap plugin memiliki dan memigrasikan jadualnya sendiri melalui pemasang db_delta() yang idempoten.
Di mana ia berjalan
PrizeX berjalan pada hosting kongsi biasa atau VPS — tiada konfigurasi pelayan khas selain pelayan web yang mampu menulis semula URL.
* Beberapa fail di bawah database/migrations/ menggunakan sambungan ADD COLUMN IF NOT EXISTS yang hanya ada pada MariaDB. MySQL 8.0/8.4 biasa menolaknya — gunakan MariaDB untuk pangkalan data, dalam pembangunan dan juga produksi.
Menjalankan pemasangan yang baharu
Tiada wizard pemasangan untuk persediaan baharu — anda mengimport skema secara terus dan mengkonfigurasi fail persekitaran.
- Pasang kebergantungan PHP:
composer install - Salin templat persekitaran dan isikan kelayakan pangkalan data anda:
cp .env.example .env - Import
database/production.sqlke dalam pangkalan data yang dinamakan dalam.envanda — ini mencipta skema penuh. - Gantikan akaun admin yang disemai (lihat kotak makluman di bawah), kemudian log masuk di
/admin/.
database/production.sql membawa satu baris tbl_admin (admin@wowcodes.in) yang cincangan kata laluannya sama pada setiap pemasangan. Padamkannya dan masukkan akaun anda sendiri sebelum beroperasi secara langsung:
php -r "echo password_hash('your-password', PASSWORD_BCRYPT), \"\n\";"DELETE FROM tbl_admin;
INSERT INTO tbl_admin (username, email, password, image, status, permission_settings)
VALUES ('yourname', 'you@example.com', '<hash from the command above>', '', 1, 1);Untuk pembangunan setempat, pelayan PHP terbina dalam berfungsi tanpa Apache: php -S localhost:8000 router.php — ambil perhatian bahawa pelayan ini mengabaikan .htaccess sepenuhnya, jadi router.php melaksanakan semula peraturan penghalaan yang sama secara manual (lihat Persediaan pelayan web).
Pembolehubah persekitaran
Semua tetapan khusus persekitaran berada dalam .env, dimuatkan melalui vlucas/phpdotenv. Salin .env.example kepada .env (diabaikan oleh git) dan tetapkan nilai sebenar bagi setiap persekitaran — sekurang-kurangnya kelayakan pangkalan data, sebelum skema diimport.
Tetapan seluruh laman yang bukan khusus persekitaran (nama aplikasi, mata wang, plugin aktif, tema aktif dan suis bagi setiap vertikal) disimpan dalam pangkalan data, di dalam tbl_settings, dan diurus dari panel admin dan bukannya di dalam fail.
Persediaan pelayan web
Peraturan penghalaan dan keselamatan — URL kemas, menyekat akses terus kepada .env/connection.php/log, dan menghalang kandungan yang dimuat naik daripada dilaksanakan sebagai PHP — ditakrifkan dalam fail .htaccess di seluruh projek. Apache dan LiteSpeed/OpenLiteSpeed membacanya secara natif.
Pada nginx, gunakan nginx.conf.example, yang mencerminkan setiap satu peraturan itu sebagai blok server{} nginx — laraskan server_name, root dan soket PHP-FPM mengikut persekitaran anda.
.htaccess (produksi), router.php (pelayan pembangunan php -S setempat) dan nginx.conf.example (nginx) masing-masing melaksanakan semula peraturan penghalaan yang sama secara berasingan. Menambah laluan URL kemas yang baharu bermakna anda perlu mengemas kini ketiga-tiganya.
Seni bina permintaan
Setiap halaman kedai (index.php, item.php, …) dimulakan melalui includes/header.php, dalam susunan ini:
connection.php memulakan sesi, menyambung melalui mysqli menggunakan kelayakan .env, memuatkan tbl_settings ke dalam pemalar seperti APP_NAME dan CURRENCY, serta melog masuk pengguna semasa berserta satu baris cap jari peranti. plugins_load() memulakan setiap plugin aktif dan memicu hook plugins_loaded — di sinilah set sebenar vertikal aktif semasa akhirnya diketahui, dan sebab itulah header.php menyemak semula bendera tetapan lama (kedai, berbilang penjual, lelongan, loteri) terhadap keadaan sebenar plugin aktif selepas itu.
Panel admin tidak menduakan proses permulaan ini — admin/includes/connection.php menetapkan konfigurasi sesi/ralat khusus admin dan kemudian memuatkan includes/connection.php akar yang sama.
Sistem plugin
Sebuah plugin ialah plugins/<slug>/plugin.php — metadata dalam komen pengepala yang dihuraikan tanpa melaksanakan fail itu — berserta plugin.json pilihan untuk maklumat katalog yang lebih kaya. Plugin aktif disimpan sebagai tatasusunan JSON dalam tbl_settings.active_plugins.
- Pemilikan jadual — setiap plugin mentakrifkan
includes/schema.phpmiliknya sendiri, yang dipanggil semasa pengaktifan, menggunakan pembantudb_delta()yang idempoten (CREATE TABLE IF NOT EXISTS+ALTER TABLE ADD COLUMNyang hanya menambah). Sesebuah plugin tidak pernah menyentuh jadual plugin lain. - Daftar dimuatkan dahulu —
add_admin_page,add_route,add_cron_job,add_api_routedanregister_modulesemuanya ditakrifkan sebelum mana-mana plugin dimuatkan, jadi panggilan peringkat atas sesebuah plugin tidak pernah menyebabkan ralat maut walaupun plugin itu akhirnya tidak aktif. - Pembuangan yang bersih — memadamkan plugin akan menjalankan
uninstall.phpmiliknya dan membuang foldernya; tiada apa-apa di luarplugins/<slug>/yang sepatutnya bergantung mati pada failnya, jadi bahagian lain laman ini terus berfungsi walaupun plugin itu sudah tiada.
Sistem tema
Sebuah tema berada di assets/themes/<slug>/ — satu manifest.php, theme.css, functions.php untuk hook tema, dan components/ pilihan. Tema aktif disimpan dalam tbl_settings.active_theme, dengan editorial sebagai sandaran jika tiada yang ditetapkan.
Peleraian komponen menyemak mengikut susunan ini: folder components/ milik tema aktif, kemudian direktori komponen yang diisytiharkan oleh register_module() sesebuah plugin, kemudian components/ akar yang dikongsi. Dalam amalan, ini bermakna lalai yang dikongsi hanya wujud sekali di dalam components/, dan mana-mana tema — atau plugin vertikal yang aktif — boleh menggantikan laluan komponen tertentu dengan salinannya sendiri.
Pangkalan data
Awalan jadual tbl_, mysqli mentah, kebanyakannya prepared statement. Fail SQL, mengikut susunan kuasanya:
database/core-schema.sql— jadual kernel sahaja, diselenggara secara manual; jadual vertikal/plugin sengaja dikecualikan.database/production.sql— dijana (skema teras + rutin pemasangan setiap plugin, dieksport daripada pangkalan data sementara). Inilah yang anda import untuk pemasangan baharu.database/sandbox.sql— set data demo/benih untuk pembangunan setempat.database/migration.sql— skrip naik taraf bersepadu dan idempoten untuk pemasangan sedia ada.database/migrations/<slug>/up.sql(+down.sqljika boleh diterbalikkan) — satu fail bagi setiap migrasi individu.
Modul
Setiap modul dihantar dalam pemasangan yang sama dan boleh dihidup atau dimatikan secara berasingan dari panel admin.
Lelongan
Pembidaan langsung dengan portal penjual berbilang penjual dan enjin komisen. Plugin teras: plugins/auction.
Loteri
Cabutan bertiket dengan jadual, hadiah dan pemberitahuan pemenang yang boleh dikonfigurasikan. Plugin teras: plugins/lottery.
Kotak misteri
Kolam hadiah yang boleh dikonfigurasikan dengan animasi pendedahan — pengguna membeli kotak dan terus melihat apa yang mereka menang. Plugin: plugins/mystery-box.
Permainan & ganjaran
Kelompok permainan arked di bawah games/ berserta plugin penglibatan/pendapatan:
Kedai & pasaran
Lapisan e-dagang berbilang penjual dengan alat promosi dan penyusunan barangan. Plugin teras: plugins/shop, plugins/multivendor.
Dompet, syiling & pelaburan
Dompet seluruh platform yang dikongsi merentas setiap modul.
Rujukan & ganjaran
Pengesahan, kepercayaan & pematuhan
Utiliti
Panel admin
Panel admin berada di bawah admin/ dan tidak menduakan proses permulaan kedai — ia menetapkan konfigurasi sesi/ralat khusus admin, kemudian memuatkan includes/connection.php akar yang sama. Halaman didaftarkan melalui add_admin_page(), yang menguruskan entri bar sisi, pengehadan keupayaan, CSRF dan rangka pengesahan; tindakan JSON khusus admin pula didaftarkan melalui add_admin_ajax() dan dihantar melalui admin/ajax.php?action=<slug>.
Item, sepanduk, halaman, menu, blog.
Pengurusan get laluan automatik & manual, semakan pembayaran manual, eksport pembayaran keluar.
Kumpulan pengguna, peranan, butiran penjual, penyamaran.
Eksport transaksi/pesanan/pengguna, log cron, penjejakan ralat, log aktiviti admin.
Kempen e-mel, templat, surat berita, pemberitahuan tolak, log pemberitahuan.
Aktifkan/nyahaktifkan plugin dan tema, tetapan SEO bagi setiap halaman, tetapan seluruh laman.
Tema kedai
Lima tema dihantar di bawah assets/themes/, boleh ditukar bagi setiap pemasangan dari panel admin. Setiap tema menyimpan salinan komponen kongsinya sendiri di bawah folder components/ miliknya.
Rupa yang ringkas dan moden dengan kad putih serta bayang lembut — pilihan selamat dan serba boleh untuk hampir apa-apa jenis kedai.
Rupa bersih bergaya majalah dengan ton kertas suam dan tipografi yang tajam, untuk kedai yang kemas dan meyakinkan.
Tema sandaran lalaiTema gelap yang berani dan mewah dengan aksen emas — direka supaya terasa mendebarkan dan berkelas tinggi.
Rupa yang suam dan penuh hiasan, diilhamkan daripada pasar tradisional, dengan sokongan bahasa kanan ke kiri.
Rupa bermusim yang seram dan meriah — latar ungu pekat dengan serlahan jingga labu yang bercahaya.
Get laluan pembayaran
38 get laluan automatik dimiliki oleh plugin — setiap satu berada dalam foldernya sendiri, plugins/gateway-<slug>/, dan mendaftarkan dirinya dengan kernel melalui add_payment_gateway(). Mengaktifkan satu get laluan terus berfungsi; tiada apa-apa dalam penghantar pembayaran (payment_processor.php) yang dikodkan tetap kepada get laluan tertentu.
3 kaedah manual itu ialah baris gateway_type = 'manual' yang disemai oleh kernel, tanpa kod init/verify untuk dikonfigurasikan — ia hanya memaparkan arahan pembayaran atau kod QR. Plugin manual-gateway-builder membolehkan admin menambah lagi kaedah pembayaran manual tersuai tanpa menyentuh kod.
Sesetengah get laluan (Stripe, Razorpay, Midtrans, Venmo) turut mendaftarkan hook render untuk aliran pembayaran yang memerlukan JS di sebelah klien — bootstrap Stripe Checkout, atau SDK Razorpay/Midtrans/Braintree yang memerlukan ID pesanan atau token dijana di sebelah pelayan terlebih dahulu. Setiap get laluan lain berfungsi tanpa sebarang pendawaian kernel tambahan.
Lapisan API & AJAX
api/v1/— REST API yang disahkan dengan JWT untuk aplikasi mudah alih dan pengguna luaran.api/v1/middleware/*.phpmengesahkan pengepalaAuthorization: Bearer <token>. Plugin menambah titik akhir mereka sendiri melaluiadd_api_route().ajax/— AJAX dalaman yang disahkan melalui kuki sesi untuk JS milik kedai itu sendiri (troli, kupon, pemberitahuan). Tiada lapisan token — ia bergantung pada sesi PHP yang disediakan olehconnection.php.api/peringkat atas yang longgar — pelbagai titik akhir tanpa versi sepertigeo_location.php,exchange-rate.phpdanofferwall_postback.php.
Aplikasi mudah alih
mobile/ ialah projek Capacitor + Ionic yang berasingan — pembalut WebView di sekeliling laman langsung, bukan SPA berdiri sendiri dan bukan semata-mata pengguna api/v1. capacitor.config.ts miliknya mengarahkan server.url ke domain anda. Ia mempunyai package.json sendiri dan tidak dibina dari akar projek:
cd mobile
npm run sync
npm run open:ios
npm run open:androidKemas kini & migrasi
Ambil syot kilat sebelum menjalankan database/migration.sql atau mana-mana database/migrations/<slug>/up.sql terhadap pangkalan data langsung:
mysqldump --single-transaction -u<user> -p<pass> <db> > pre-deploy-$(date +%Y%m%d-%H%M%S).sqlKebanyakan migrasi disertakan down.sql yang sepadan untuk mengundurkan satu perubahan itu sahaja. Beberapa migrasi yang mengubah data sedia ada dan bukan sekadar menambah struktur pula disertakan down.sql yang mendokumenkan sebab ia tidak melakukan apa-apa — bagi migrasi tersebut, pulihkan daripada salinan pangkalan data yang diambil sebelum penggunaan jika anda perlu berundur.
Nota keselamatan
- Tukar kelayakan admin yang disemai serta-merta selepas import (lihat Pemasangan).
.env,connection.phpdan fail log disekat daripada akses HTTP terus oleh peraturan.htaccess/ nginx yang disertakan — jangan buang peraturan tersebut.- Kandungan yang dimuat naik disajikan dengan cara yang menghalangnya daripada dilaksanakan sebagai PHP, dikuatkuasakan pada peringkat konfigurasi pelayan web, bukan peringkat aplikasi.
- Kelayakan get laluan pembayaran dikonfigurasikan bagi setiap get laluan dari panel admin dan disimpan di sebelah pelayan — tidak pernah didedahkan kepada kedai.
Pengujian
Tiada suite PHPUnit. composer test menjalankan bin/run-probes.php, yang menghimpunkan setiap fail probe_*.php di bawah includes/_probes/ dan folder _probes/ milik setiap plugin, menjalankan setiap satu sebagai subproses CLI dan menyemak kod keluarnya.
composer test # run every probe
php plugins/<slug>/_probes/probe_*.php # run a single probe directly
php bin/run-probes.php --all # also run destructive probes (skipped by default)Soalan lazim
Sokongan & sumber
Masih tersekat, atau perlukan sesuatu yang tidak diliputi oleh halaman ini?