JomMula

Gallery Blog · Sub-lesson 01

Gambaran besar: apa kita nak buat

Kita try paham dulu apa benda yang kita nak buat, macam mana orang guna dia, dan tech stack apa yang kita pakai. Kod nanti — faham dulu.

5 minit bacaExplanationno codeKemaskini Oktober 2026
Dalam projek ni (01/07)
  1. Gallery Blog
  2. 01Gambaran besar: apa kita nak buat
  3. 02Mockup with opencode
  4. 03Setup monorepo + React + Express
  5. 04Database & API
  6. 05Upload gambar ke R2
  7. 06Admin section + auth
  8. 07Komen, like & deploy

Baca ikut turutan

Setiap sub-lesson pendek je. Habiskan satu, baru pergi yang seterusnya — jangan skip.

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

0/6 siap

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.

Re

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.

Ex

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.

Ne

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.

R2

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

minta data1query2balik JSON3gambar terus dari R24ReactPublic UI + Admin UIjalan dalam browserExpress APIlogic + authpintu masuk dataNeongambar · folderkomen · likeCloudflare R2fail gambarmurah + laju
  1. 1React minta data dari Express.
  2. 2Express query Neon — bagi semua gambar ikut folder.
  3. 3Neon pulangkan data, Express hantar balik sebagai JSON.
  4. 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
          
apps/web = Reactapps/api = Expresspackages/shared = kongsi

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:

Ni yang visitor nampak. Nak upload?

Try buat macam ni:

  1. Pergi Admin, upload gambar baru.
  2. Create folder sendiri, susun gambar ikut suka.
  3. 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.

02

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

Baca sekarang