Panduan alur coding — Toko Mango (fullstack SMK)

Memahami frontend admin + backend API, lalu alur sistem, alur coding, dan alur folder/file. Selaras dengan backend/ALUR-CODING.md.

0 Gambaran project (dua folder utama)

testfullstack/          ← folder project (buka di VS Code / Cursor)
├── backend/               ← API Express + MySQL  → http://localhost:5000
└── frontend/              ← React + Vite         → http://localhost:5173
Yang dijalankanTerminalPerintahURL
API1cd backend lalu npm run dev:5000
Web2cd frontend lalu npm run dev:5173

Jalankan kedua terminal — web butuh API sudah hidup dulu.

Penting: panel admin di browser tidak bisa mengambil data jika backend mati — akan muncul error seperti Failed to fetch atau loading terus.

1 Frontend ↔ Backend — panel admin (baca ini dulu)

1.1 Dua “aplikasi” terpisah

LapisanTeknologiTugas
FrontendReact (Vite)Tampilan halaman, form, tabel, modal
BackendExpress + MySQLSimpan/baca data, cek login, kirim JSON

Browser hanya menampilkan React. React memanggil API lewat fetch ke http://localhost:5000.

1.2 Login admin — dari tombol sampai data muncul

[Siswa buka http://localhost:5173/login]
        │
        ▼
LoginPage.jsx  →  POST http://localhost:5000/api/users/login
        │              body: { email, passwd }
        ▼
usersController (backend)  →  cek password  →  JWT + role: "admin"
        │
        ▼
AuthContext.jsx  menyimpan token di localStorage
        │
        ▼
Navigate ke /admin  →  RequireAuth cek role === "admin"
        │
        ▼
AdminLayout (sidebar + konten)

1.3 Satu halaman admin = React + banyak endpoint API

Contoh halaman Produk (/admin/produk):

Di browser (frontend)Di server (backend)
AdminProdukPage.jsx — tabel + Tambah / Detail / Ubah / HapusGET /api/admin/produk
Klik Detail → modalGET /api/admin/produk/:id
Klik Ubah → form modalPUT /api/admin/produk/:id
Klik Hapus → konfirmasiDELETE /api/admin/produk/:id
Tombol TambahPOST /api/admin/produk
Upload gambar produkPOST /api/admin/upload-gambar → path di kolom gambar

Semua request admin memakai header:

Authorization: Bearer <token dari localStorage>

Diatur di frontend/src/api/http.js (authHeaders()).

1.4 Peta URL frontend admin ↔ API backend

Menu / halamanFile halamanAPI utama (/api/admin/...)
DashboardAdminOverviewPage.jsxGET /stats
ProdukAdminProdukPage.jsxCRUD /produk, upload gambar
PembeliAdminPembeliPage.jsxGET /pembeli, CRUD /users/:id
PesananAdminPembelianPage.jsxGET/PUT/DELETE /pembelian
ArtikelAdminArtikelPage.jsxCRUD /artikel
KontakAdminKontakPage.jsxGET/PUT/DELETE /kontak
Info tokoAdminInfoTokoPage.jsxGET/PUT /info-toko
ProfilAdminProfilPage.jsxGET/PUT /me

Routing: frontend/src/App.jsx. API: frontend/src/api/adminApi.js.

1.5 Komponen frontend yang dipakai ulang

FileFungsi
layouts/AdminLayout.jsxSidebar + area konten
components/admin/AdminSidebar.jsxMenu navigasi
context/AdminShopContext.jsxLogo + nama toko di sidebar (dari DB)
components/admin/AdminRowActions.jsxTombol Detail · Ubah · Hapus
components/admin/AdminDetailModal.jsxModal baca saja
components/admin/AdminModal.jsxModal form tambah/ubah
hooks/useAdminList.jsAmbil daftar + loading/error
hooks/useAdminGuard.jsRedirect jika token habis / bukan admin

Alur CRUD (misalnya Kontak):

  1. useAdminList(adminApi.getKontak) → tabel.
  2. DetailgetKontakByIdAdminDetailModal.
  3. UbahAdminModal + updateKontak.
  4. HapusdeleteKontak + reload().

2 Alur sistem (besar — siapa ngapain)

2.1 Diagram umum fullstack

┌─────────────┐     HTTP (JSON)      ┌─────────────┐     SQL      ┌──────────┐
│   Browser   │ ◄──────────────────► │   Backend   │ ◄──────────► │  MySQL   │
│  React Vite │   localhost:5000     │   Express   │              │ toko DB  │
│    :5173    │                      │             │              │          │
└─────────────┘                      └─────────────┘              └──────────┘

2.2 Tiga “pengguna” sistem

PenggunaFrontendBackendKeterangan
Pengunjung/ (HomePage)GET /api/users/produk, artikel, info-tokoTanpa login
Pembeli/login, /akun/me, /pembelianJWT role pembeli
Admin/login/admin/*/api/admin/...JWT role admin

Admin memakai GET /api/admin/me, bukan GET /api/users/me.

2.3 Alur admin mengelola toko

  1. Import / buat database (toko_online.sql atau database/schema-latihan-toko.sql).
  2. Pastikan ada user admin (seed-admin.sql atau data di dump).
  3. Terminal 1: cd backendnpm run dev. Terminal 2: cd frontendnpm run dev.
  4. Login di /login dengan akun admin.
  5. Dashboard → /api/admin/stats.
  6. Kelola: produk, pembeli, pesanan, artikel, kontak, info toko.

2.4 Alur pembeli (singkat)

  1. Lihat katalog — tanpa login (GET /api/users/produk).
  2. Daftar / login → JWT pembeli.
  3. Checkout → POST /api/users/pembelian (id_pembeli dari token).
  4. Riwayat → GET /api/users/pembelian.

Detail lengkap: lihat Bagian 6.

3 Alur coding (satu request masuk sampai keluar)

3.1 Backend — urutan eksekusi (MVC API)

Browser / React (fetch)
    → server.js              (Express, CORS, JSON body, static uploads)
    → routes/admin.js        (cocokkan URL + method)
    → middlewares/           (authenticate + requireRole("admin"))
    → controllers/           (validasi, aturan bisnis, status HTTP)
    → models/                (query SQL)
    → config/db.js           (pool MySQL)
    → respons JSON balik ke React

Kenapa urutannya begitu? Route = peta URL, controller = logika, model = data. Ganti database cukup sentuh models/.

3.2 Frontend admin — urutan eksekusi

AdminProdukPage.jsx (atau halaman lain)
    → adminApi.getProduk()     (adminApi.js)
    → http.js apiRequest()     (tambah Bearer token, base URL)
    → fetch → backend
    → setState(rows) → render tabel
    → AdminRowActions → modal Detail / Ubah / Hapus

Konfigurasi: frontend/.env.developmentVITE_API_URL=http://localhost:5000.

3.3 Contoh: admin klik “Hapus produk”

LangkahLapisanApa yang terjadi
1UIonDelete(id) + window.confirm
2adminApi.jsDELETE /api/admin/produk/5 + Bearer
3routes/admin.jsadminController.deleteProduk
4MiddlewareCek JWT + role === admin
5ControllerValidasi id, panggil model
6ModelDELETE FROM produk WHERE id_produk = ?
7UIreload()getProduk lagi

4 Alur folder & file (mulai baca dari mana)

4.1 Pohon folder backend

backend/
├── server.js                 ← ① PINTU MASUK
├── .env                      ← ② PORT, JWT_SECRET, DB_*
├── config/db.js              ← ③ pool MySQL
├── routes/users.js, admin.js ← ④⑤ routing
├── middlewares/              ← ⑥⑦ auth, role, upload
├── controllers/              ← logika + JSON
├── models/                   ← SQL per tabel
├── uploads/images/
├── toko_online.sql
└── database/

4.2 Pohon folder frontend (admin)

frontend/src/
├── main.jsx, App.jsx         ← ①② routing
├── context/AuthContext.jsx, AdminShopContext.jsx
├── api/http.js, adminApi.js  ← ④⑤ panggil API
├── layouts/AdminLayout.jsx
├── pages/admin/              ← halaman panel
├── hooks/useAdminList.js, useAdminGuard.js
└── components/admin/

4.3 Urutan belajar (siswa)

UrutanBaca / kerjakanKenapa
1Jalankan backend + frontend + login admin + menu /adminPahami hasil dulu
2App.jsx + AdminProdukPage.jsxURL browser ↔ API
3adminApi.js + http.jsCara React memanggil backend
4routes/admin.jsDaftar endpoint admin
5adminController.jsLogika setelah request masuk
6produkModel.js (contoh)SQL & tabel
7server.js + authMiddleware.jsServer menyambungkan semuanya
8Postman — uji tanpa ReactLatihan API murni

4.4 Peran folder vs MVC

FolderPeranCatatan
routes/RoutingURL → middleware → controller
controllers/ControllerValidasi + JSON
models/ModelSQL dengan ?
middlewares/FilterAuth, role, upload
config/InfrastrukturBukan bisnis toko

View HTML tidak ada di API — tampilan admin ada di React, backend hanya JSON.

5 Ringkasan endpoint /api/admin

Semua route di bawah router.use(authenticate, requireRole("admin")) di routes/admin.js.

MethodPathFungsi
GET/meProfil admin login
PUT/meUbah profil admin
GET/statsAngka dashboard
GET/pembeliDaftar pembeli (ringkas)
GET/usersDaftar user (?role=pembeli)
POST/usersTambah akun pembeli
GET/PUT/DELETE/users/:idDetail / ubah / hapus pembeli
GET/POST/produkDaftar / tambah produk
GET/PUT/DELETE/produk/:id_produkDetail / ubah / hapus
GET/pembelianSemua pesanan
GET/PUT/DELETE/pembelian/:idDetail / ubah / hapus
GET/POST/artikelDaftar / tambah artikel
GET/PUT/DELETE/artikel/:idDetail / ubah / hapus
GET/kontakDaftar pesan kontak
GET/PUT/DELETE/kontak/:idDetail / ubah / hapus pesan
GET/PUT/info-tokoBaca / ubah data toko
POST/upload-gambarUpload (field gambar) → data.path

6 Alur belanja pembeli (/api/users)

Base URL: http://localhost:5000/api/users

LangkahEndpointAuth
Lihat katalogGET /produk, GET /produk/:id_produkTidak
Info toko & artikelGET /info-toko, GET /artikelTidak
Daftar / loginPOST /register, POST /loginTidak
Form kontakPOST /contactTidak
ProfilGET/PUT /meBearer pembeli
Upload gambarPOST /upload-gambarBearer pembeli
Buat pesananPOST /pembelianBearer pembeli
RiwayatGET /pembelian, GET /pembelian/:idBearer pembeli
Keamanan pesanan: id_pembeli diambil dari req.user.id (JWT), bukan dari body.

File terkait: routes/users.jspembeliController.jspembelianModel.js, dll.

7 File SQL & database

FileFungsi
toko_online.sqlDump database acuan (phpMyAdmin)
database/schema-latihan-toko.sqlBuat tabel dari nol
seed-admin.sqlUser admin jika belum ada
seed-lengkapi-toko-online.sqlContoh produk/artikel/info toko
database/alter-database-yang-sudah-ada.sqlSelaraskan DB lama
scripts/migrate-foto-bukti.jsKolom pembelian.foto_bukti (npm run db:migrate-foto-bukti)

8 Upload gambar

TopikNilai
Folder penyimpananbackend/uploads/images/
Akses filehttp://localhost:5000/uploads/images/<namafile>
Admin uploadPOST /api/admin/upload-gambar (Bearer admin, field gambar)
Pembeli uploadPOST /api/users/upload-gambar (profil / bukti bayar)
AturanJPEG/PNG/GIF/WebP, maks 5 MB
Path di JSONBentuk /uploads/images/...

9 Ringkasan satu kalimat

Panel admin: React di :5173 menampilkan /admin/* dan memanggil JSON API di :5000/api/admin/* dengan token JWT admin.

Backend: setiap request mengalir server.jsroutesmiddlewarescontrollersmodels → MySQL, lalu balik sebagai JSON ke React.