Okay harini kita nak belajar pasal macam mana nak buat gallery blog (takde idea lah nak kasi nama apa). Nanti kita pilih sama-sama.
Okay berdasarkan yang kau cakap hari tu kan — basically kau nak buat website yang orang boleh tgk gambar-gambar yang kau post, and boleh comment or maybe like. But you want to build it in your own design kann. Sooo its very simple actually — but let think it in flow, macam mana a user akan guna dia.
Nama dulu — sebab ni yang paling susah
Ni part paling susah sebenarnya. Bukan kod tapi nama (dgn nada melawak). Tekan mana-mana satu yang kau rasa kena:
Tekan mana-mana satu. Ni demo je — nama pun tak affect ape-ape.
Apa yang projek ni kena ada
Okay senang cerita — ni senarai benda yang projek ni kena boleh buat. Tick la yang kau dah ada:
Senarai keperluan
Yang belum ada tu tak kisah langsung. Kita akan setup satu-satu dalam lesson akan datang.
Flow: macam mana orang guna website ni
First we need to understand that bila kau masuk website tu, obviously benda yang orang akan nampak adalah gambar-gambar etc. And then maybe die boleh open gambar tu and comment or like, dan sebagainya.
Tapi ingat — flow dia bukan satu, tapi dua. Ada flow visitor, dan ada flow admin (kau). Tekan tab tu dan tengok satu-satu:
Tekan setiap step untuk fokus
Ringkasan: buka → tengok → klik → like/komen. Semua tanpa login.
Haa tu je sebenarnya flow dia. Simple kan?
Tapi tunggu — gambar tu datang dari mana?
Ni part yang orang selalu terlepas pandang. Visitor nampak gambar je — tapi macam mana gambar tu sampai ke sana?
So sekarang kau ada dua bahagian besar yang jelas:
Public side
untuk visitor
- Sesiapa boleh masuk, takde login
- Tengok gambar ikut folder
- Buka gambar besar (lightbox)
- Like dan tinggal komen
Admin side
untuk kau sorang
- Login dulu baru boleh masuk
- Upload gambar baru bila-bila masa
- Create folder dan susun gambar
- Customize page ikut suka
Thats about how it works. Simple right?
Tech stack: apa kita pakai untuk bina ni
Now we go into tech stack. Haa this is pretty wide — sebab you can use anything. Laravel pun boleh, PHP pun boleh, WordPress pun boleh. But for simplicity, let just use react + expressjs + neon + r2 cloudflare. Simple and practical.
Kenapa stack ni? Sebab dia satu bahasa — JavaScript dari depan sampai belakang. Kau tak payah switch otak antara dua bahasa yang berbeza.
React
Frontend
Semua yang orang nampak — grid gambar, lightbox, admin dashboard. Ni yang kau tulis dengan JavaScript.
Kenapa ni?
Senang pecahkan UI jadi component, dan boleh guna balik untuk public side dengan admin side.
ExpressJS
Backend API
Pintu masuk data. React tanya, Express jawab. Upload, komen, like — semua lalu sini.
Kenapa ni?
Ringan dan tak banyak magik. Kau nampak setiap line buat apa.
Neon
Database (Postgres)
Simpan data bersusun: senarai gambar, folder, komen, like, dan user admin.
Kenapa ni?
Postgres serverless — tak payah setup server database sendiri, dan ada free tier.
Cloudflare R2
Storage gambar
Simpan fail gambar tu sendiri. Database simpan URL je, bukan fail.
Kenapa ni?
Murah (takde bayaran egress), laju, dan S3-compatible — senang nak guna.
Macam mana semua ni bersambung
Ni part paling penting dalam lesson ni — macam mana semua benda tu bercakap antara satu sama lain. Tekan dua-dua flow tu:
Tekan butang untuk tukar flow
- 1React minta data dari Express.
- 2Express query Neon — bagi semua gambar ikut folder.
- 3Neon pulangkan data, Express hantar balik sebagai JSON.
- 4Browser ambil fail gambar terus dari R2 — server kita tak payah lalu.
Struktur projek: mono repo
Last sekali — mono repo structure. Mono repo ni maksudnya satu repo, banyak app. Instead of asingkan frontend dan backend dalam repo berlainan, kita letak semua dalam satu:
Struktur repo
gallery-blog/
├─ apps/
semua app dalam satu tempat
│ ├─ web/
React — public site + admin UI
│ │ ├─ src/
│ │ └─ package.json
dependencies untuk web
│ └─ api/
Express — REST API
│ ├─ src/
│ └─ package.json
dependencies untuk api
├─ packages/
barang yang dikongsi
│ └─ shared/
types & helper kongsi
├─ package.json
scripts untuk semua app
└─ README.md
cara nak run projek
Kenapa? Sebab React dan Express kongsi benda yang sama. Contoh, bentuk data Photo — dua-dua perlukan dia:
// packages/shared/src/types.ts
// Satu "bentuk" data yang dikongsi oleh web + api
export interface Photo {
id: number;
title: string;
folder: string;
imageUrl: string; // URL dari Cloudflare R2
createdAt: string;
}
Kalau dua repo berasingan, setiap kali tukar bentuk data ni kena copy-paste kat dua tempat. Satu repo — senang, takde nak sync sana sini.
Cuba dulu: demo yang boleh klik
Okay sekarang part paling best. Ni demo gallery blog yang kita akan bina — bukan screenshot, betul-betul boleh klik:
galeri-kito.my
Ni yang visitor nampak. Nak upload?
Try buat macam ni:
- Pergi Admin, upload gambar baru.
- Create folder sendiri, susun gambar ikut suka.
- Balik ke Visitor, klik gambar tu, like dan tinggal komen.
Semua yang kau baru buat tu — itulah projek kita. Bezanya nanti, data tu duduk dalam Neon dan gambar duduk dalam R2, bukan dalam browser je.
Recap: apa kita dah tau harini
Gallery blog ada dua sisi: public untuk visitor, admin untuk kau.
Flow visitor: buka → pilih folder → klik gambar → like & komen.
Flow admin: login → upload gambar → terus live kat public page.
Stack kita: React (UI) + Express (API) + Neon (database) + R2 (fail gambar).
Satu repo, banyak app — tu yang orang panggil monorepo.
That’s it untuk sub-lesson pertama ni. Kalau kau baca sampai habis — tahniah, kau dah faham bentuk projek kita sebelum tulis walau satu line kod pun.
Seterusnya
Mockup with opencode
Sebelum kita buat bende yg complex pakai React dan database, kita vibe code dulu. Guna opencode, kita buat mockup guna HTML je, sng boleh tgk semua terus