尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗Web app tra cứu kết quả xổ số bằng Next.js App Router, TypeScript, Tailwind CSS, shadcn-style UI primitives và lucide-react.
npm install
npm run dev
Mở http://localhost:3000.
npm run test
npm run build
https://vietlott.vn/vi/trung-thuong/ket-qua-trung-thuong/535https://vietlott.vn/vi/trung-thuong/ket-qua-trung-thuong/645https://vietlott.vn/vi/trung-thuong/ket-qua-trung-thuong/655https://github.com/vietvudanh/vietlott-data
data/power535.jsonldata/power645.jsonldata/power655.jsonl5xaw-6ayf.https://euromillions.api.pedromealha.dev/v1/draws, with fallback to /draws.https://www.lottoland.com/api/drawings/euroJackpot/YYYYMMDD.next) cho EuroMillions và EuroJackpot, trang Mega Millions của Texas Lottery cho Mega Millions. Vietlott chưa có nguồn công khai nên không hiển thị mục này.https://open.er-api.com/v6/latest/USD (chính), fallback https://api.frankfurter.dev/v1/latest?base=USD (ECB, không có VND), cuối cùng là bảng tỷ giá ngoại tuyến trong src/lib/lottery/fx.ts.All external data access is routed through Next.js backend code in src/lib/lottery/adapters and exposed via:
GET /api/lottery/games
GET /api/lottery/latest?gameId=...¤cy=VND|USD|EUR
GET /api/lottery/history?gameId=...&from=YYYY-MM-DD&to=YYYY-MM-DD&page=1&pageSize=30¤cy=VND|USD|EUR
GET /api/lottery/fx
POST /api/lottery/refresh — xoá cache của phần "kỳ mới nhất" để nút Làm mới thực sự gọi lại nguồn (có cooldown 20 giây, không đụng tới cache lịch sử).
Each lottery provider has an adapter returning the normalized LotteryDraw schema in src/lib/lottery/types.ts.
Adapter nào có nguồn công bố jackpot kỳ chưa quay thì cài thêm getNext(), trả về NextDraw.
Đây là hai con số khác nhau và trước đây rất dễ nhầm:
Ví dụ EuroMillions ngày 23-10-2026: kỳ vừa quay cộng dồn €70,2M, còn mức công bố cho kỳ 27-10 là €79M.
Giải thưởng được lưu dưới dạng Money = { amount: number; currency: "VND" | "USD" | "EUR" } (src/lib/lottery/money.ts),
không phải chuỗi đã format sẵn. Adapter dùng parseMoneyText để đọc số tiền từ nguồn, còn việc hiển thị và quy đổi
diễn ra ở tầng UI.
currency tùy chọn trên API sẽ quy đổi mọi giá trị tiền sang một đơn vị duy nhất trước khi trả về.Gốc giữ nguyên tiền tệ của từng giải và hiển thị thêm dòng quy đổi sang VND cho các giải nước ngoài.src/app/manifest.ts phục vụ /manifest.webmanifest, kèm icon PNG 192/512 và một bản maskable
trong public/icons/. Không có manifest thì Brave/Chrome/Edge không có "app identity" để cài, nên
mục Install không hiện ra. Icon được sinh từ src/app/icon.svg bằng sharp.
Cửa sổ sau khi cài chiếm trọn màn hình nên status bar, tai thỏ hoặc title bar có thể đè lên nội dung.
.app-shell và .app-header trong globals.css cộng thêm env(safe-area-inset-*) để tránh việc đó
(header dùng position: sticky nên top tính theo viewport chứ không theo padding của shell).
Trên desktop, display_override: ["window-controls-overlay", ...] giao luôn dải title bar cho trang:
.app-titlebar là một dải trống có app-region: drag (không có nó thì không kéo được cửa sổ), và
nội dung được đẩy xuống dưới env(titlebar-area-height). Trình duyệt không hỗ trợ sẽ tự lùi về
standalone.
Nếu đã cài app từ trước khi có manifest, phải gỡ ra cài lại — bản cũ chỉ là shortcut mở trong tab.
Nhà điều hành công bố kỳ quay theo ngày ở nước họ. EuroMillions quay 21:00 giờ Paris ngày 03/11 thì ở Việt Nam đã là 03:00 ngày 04/11, nên mục "Jackpot kỳ tới" dễ trông như bị lùi một ngày.
NextDraw.drawAt lưu đúng thời điểm đó dưới dạng UTC instant (src/lib/lottery/drawTime.ts,
có xử lý giờ mùa hè), còn giao diện hiển thị theo Asia/Ho_Chi_Minh. Ngày của kỳ đã quay vẫn
giữ nguyên theo nguồn, để đối chiếu với trang chính thức không bị lệch.
Bốn bộ giao diện khác nhau về màu, phông chữ, bo góc, đổ bóng và hình dạng quả cầu số. Chọn bằng biểu tượng bảng màu trên header; mỗi bộ đều có biến sáng và tối.
| Bộ | Phong cách | Phông hiển thị | Bo góc |
|---|---|---|---|
aurora | Kính mờ, chuyển sắc, teal (mặc định) | Inter | mềm |
ban-tin | Giấy in, phẳng hoàn toàn, mực đỏ | Playfair Display | gần vuông |
neon | Nền tối, magenta/cyan, phát sáng | JetBrains Mono (in hoa) | rất tròn |
toi-gian | Đơn sắc, không đổ bóng | Inter | vuông |
Mỗi bộ định nghĩa cùng một tập token trong src/styles/globals.css, chọn qua [data-skin] trên <html>.
Component không được hard-code bảng màu, bán kính bo góc hay phông chữ — Tailwind borderRadius và
fontFamily cũng trỏ vào các token này. Danh sách bộ giao diện nằm ở src/lib/theme.ts.
Một script nhỏ chạy trước khi trang vẽ lần đầu (themeBootstrapScript) để đọc lựa chọn đã lưu, tránh
nháy giao diện mặc định mỗi lần tải lại.
Lưu trong localStorage và áp dụng ở client (src/components/lottery/PreferencesProvider.tsx):
lote:currency — đơn vị tiền tệ hiển thị (native | VND | USD | EUR).lote:gameOrder — thứ tự các loại xổ số, chỉnh bằng kéo thả hoặc mũi tên ở mục "Sắp xếp & ẩn xổ số".
Thứ tự này áp dụng cho cả lưới tổng quan lẫn thanh tab chọn game.lote:hiddenGames — các loại xổ số bị ẩn khỏi lưới tổng quan và thanh tab. Luôn phải còn ít nhất một
loại hiển thị. Loại đang bị ẩn vẫn mở được bằng URL trực tiếp (/games/<id>) và khi đó vẫn xuất hiện
trên thanh tab để biết mình đang xem gì.lote:skin — bộ giao diện đang dùng.lote:theme — chế độ sáng/tối; chưa đặt thì theo prefers-color-scheme.Server-side in-memory cache is implemented in src/lib/lottery/cache.ts.
TTL.latest (60 giây) — memo hoá một lượt render "kỳ mới nhất".TTL.upstream (10 phút) — mức cũ tối đa mà một payload từ nguồn được phép có khi phục vụ "kỳ mới nhất". Nhiều nguồn trả 429 nếu poll dày hơn.TTL.history (24 giờ) — dữ liệu lịch sử.Một payload có thể vừa phục vụ lịch sử vừa phục vụ kỳ mới nhất. Khi đó lượt đọc "kỳ mới nhất" truyền thêm
maxAgeMs vào getCached để không bị trả về bản đã nằm trong cache cả ngày — nếu thiếu bước này, một kỳ quay
mới có thể không xuất hiện suốt 24 giờ dù nguồn đã có dữ liệu.
The cache is per server process. In serverless deployments it may be reset between cold starts.
Nguồn Vietlott thay đổi cấu trúc, cần cập nhật parser.Warnings.src/lib/lottery/tax.ts, không phải con số quyết toán chính thức.Thông tin chỉ dùng để tham khảo, vui lòng đối chiếu với nguồn chính thức trước khi nhận thưởng. Không khuyến khích cờ bạc.