Nền tảng đặt món & vận hành cửa hàng — website Nuxt SSG ba ngôn ngữ, kiosk tự phục vụ, POS trên tablet và trang quản trị, xây dựng theo dạng pnpm/Turborepo monorepo.
Một cửa hàng cần một nền tảng chung cho cả đặt món online lẫn vận hành tại quán — website, kiosk tự phục vụ, POS trên tablet và trang quản trị — do một developer duy nhất thiết kế, xây dựng và vận hành.
Ràng buộc
Developer duy nhất cho cả frontend, backend, database và deployment
Checkout đồng thời nhưng không có race condition
Thanh toán thật bằng iDEAL và thẻ
Website ba ngôn ngữ cho khách hàng
In hóa đơn trên máy in ESC/POS từ trình duyệt
Quyết định
D1
State machine đơn hàng hai trục
Trạng thái đơn được mô hình hóa thành một state machine tường minh và do API kiểm soát.
D2
Idempotency key + advisory lock
Loại bỏ race condition khi nhiều checkout đến cùng lúc.
Stack, từ giao diện xuống tới server chạy hệ thống.
L1 ▽ ±0.00 · A-201
Giao diện
Ứng dụng web nhiều portal, một website SSG ba ngôn ngữ, giao diện kiosk và POS.
0807060405030201
20182020202220242026
L1 over time: 8 projects pass through it.
Cốt lõi
Vue 3 · Banh Mi Daily, EngiHire (Engilink)
Nuxt 4 · Banh Mi Daily
TypeScript · Banh Mi Daily, EngiHire (Engilink)
Có kinh nghiệm
TailwindCSS
Element Plus · EngiHire (Engilink)
Ant Design Vue · Banh Mi Daily
PWA · Banh Mi Daily
Web Bluetooth · Banh Mi Daily
8 dự án đi qua tầng này: Aconcept, Learningift, Rectelework, Learningpocket, JSIC, Engibase Suite, EngiHire (Engilink), Banh Mi Daily.
L2 ▽ −2.20 · A-202
Frontend Architecture
Nhiều portal trong một codebase, ranh giới module rõ ràng và UI dùng chung.
0706030201
20182020202220242026
L2 over time: 5 projects pass through it.
Cốt lõi
Feature-Sliced Design · Banh Mi Daily, EngiHire (Engilink)
Monorepo (pnpm + Turborepo) · Banh Mi Daily, EngiHire (Engilink)
Có kinh nghiệm
Design Systems
Vite · EngiHire (Engilink)
5 dự án đi qua tầng này: Learningift, Rectelework, Engibase Suite, EngiHire (Engilink), Banh Mi Daily.
A-301 · Chi tiết 01 · Tỉ lệ 1:5
Chia sẻ đúng ranh giới
Trách nhiệm nào có thể thay đổi độc lập?
Ba portal cùng build từ workspace packages/. Thay đổi trong packages/ đến được cả ba; thay đổi bên trong feature slice của một portal chỉ nằm trong portal đó.
Ba portal của EngiHire dùng chung package trong một workspace, phân định rõ trách nhiệm giữa frontend và API.
※ Minh họa đơn giản cho một quyết định đã có tài liệu.
L5 ▽ −8.80 · A-205
Dữ liệu & tính nhất quán
Đơn hàng luôn đúng khi nhiều checkout đến cùng lúc.
0201
20182020202220242026
L5 over time: 2 projects pass through it.
Cốt lõi
PostgreSQL · Banh Mi Daily
Prisma · Banh Mi Daily
MongoDB · EngiHire (Engilink)
Có kinh nghiệm
Mongoose
State machine đơn hàng · Banh Mi Daily
Idempotency keys · Banh Mi Daily
Advisory locks · Banh Mi Daily
2 dự án đi qua tầng này: EngiHire (Engilink), Banh Mi Daily.
A-305 · Chi tiết 05 · Tỉ lệ 1:5
Làm trạng thái tường minh
Một đơn hàng được phép thay đổi những gì?
Mỗi đơn mang hai trạng thái, orderStatus và paymentStatus, và API nắm cả hai. API chấp nhận các thay đổi mà state machine cho phép và từ chối phần còn lại, chẳng hạn COMPLETED trước READY.
Mô hình hóa quy tắc nghiệp vụ ở nơi có thể thực thi chúng. Ở Banh Mi Daily, API nắm state machine đơn hàng.
Đơn hàng · orderStatus
RECEIVED
Đã ghi nhận đơn, chưa vào bếp
PREPARING
Bếp đang làm
READY
Món đã xong, chờ khách nhận
COMPLETED
Khách đã nhận món
CANCELLED
Đơn đã bị hủy chủ động
EXPIRED
Đơn tự hết hạn khi quá thời gian giữ đơn
Thanh toán · paymentStatus
UNPAID
Chưa thanh toán
PENDING
Đang chờ xác nhận thanh toán (mọi thanh toán chưa được xác nhận đều ở trạng thái này)
PAID
Đã nhận tiền
FAILED
Thanh toán thất bại, bị hủy hoặc hết hạn; không còn lần thanh toán đang hoạt động
※ Minh họa đơn giản cho một quyết định đã có tài liệu.
L6 ▽ −11.00 · A-206
Hạ tầng & triển khai
Tự deploy và vận hành hệ thống, có CI kiểm soát.
01
20182020202220242026
L6 over time: 1 projects pass through it.
Cốt lõi
Docker · Banh Mi Daily
Nginx · Banh Mi Daily
GitHub Actions CI · Banh Mi Daily
Có kinh nghiệm
Docker Compose
Hetzner VPS · Banh Mi Daily
Cloudflare Pages & R2 · Banh Mi Daily
E2E test trên PostgreSQL · Banh Mi Daily
Một dự án đi qua tầng này: Banh Mi Daily.
A-401 · Mặt bằng · Tỉ lệ 1:50
Mặt bằng tại ▽ −11.00 — Triển khai
Banh Mi Daily là dự án duy nhất có tài liệu về phần triển khai.
Trong ranh giới khu đất · tự quản lý
Nginx — Reverse proxy trên VPS
NestJS API · Docker — Đơn hàng · giá & VAT · auth
Managed services
Cloudflare Pages — Hosting website tĩnh
Cloudflare R2 — Ảnh được xử lý bằng Sharp
Mollie — iDEAL & thẻ · webhook có chữ ký
GitHub Actions — lint · typecheck · test · E2E trên PostgreSQL
Không có tài liệu
PostgreSQL · Prisma — Không có tài liệu về nơi host
Triển khai
GitHub Actions CI chạy lint, typecheck, test và E2E test trên PostgreSQL
API chạy trong Docker, phía sau Nginx, trên một VPS
Website và ảnh được serve từ Cloudflare Pages và R2
※ Sơ đồ các trách nhiệm có trong tài liệu. Không phải traffic thật.
A-501 · Sửa đổi
Sự nghiệp — một quá trình xây dựng.
HTML và jQuery, Vue component trên Laravel API, gần sáu năm làm Frontend Architecture song song với backend, và giờ là một nền tảng tự xây dựng và vận hành end-to-end.
20182020202220242026
FreelancerMangoAdsEzbookGroot Co., LtdBanh Mi Daily
Sự nghiệp từ 2018 đến 2026, vẽ thành một chuỗi kích thước chạy dọc xuống.
REV 5 · 06/2026 — Hiện tại
Full-Stack Developer
Banh Mi Daily · Freelance
Developer duy nhất của một nền tảng đặt món & vận hành cửa hàng: website Nuxt SSG ba ngôn ngữ, kiosk tự phục vụ, POS trên tablet và trang quản trị, xây dựng theo dạng pnpm/Turborepo monorepo.
NestJS, Prisma và PostgreSQL — state machine đơn hàng hai trục, idempotency key và advisory lock để loại bỏ race condition khi checkout đồng thời, giá & VAT do server quyết định, JWT refresh token rotation kết hợp RBAC, pipeline xử lý ảnh Sharp → Cloudflare R2.
Thanh toán qua Mollie (iDEAL & thẻ) với webhook idempotent, có verify chữ ký, dùng để đối soát trạng thái thanh toán và xác nhận đơn.
Vue 3 / Nuxt 4, Ant Design Vue, TanStack Query với Zod validation tại ranh giới API, Feature-Sliced Design, PWA, in hóa đơn ESC/POS qua Web Bluetooth.
API đóng gói bằng Docker, chạy sau Nginx trên VPS, Cloudflare Pages/R2, GitHub Actions CI (lint, typecheck, test, E2E trên PostgreSQL).